У меня есть код, который работает под GCC, но не скомпилирован в Visual Studio 2015 (который я понимаю в разработке, но эта область I думаю, is должен быть реализован).Является ли это компилятором или просто мной: Унаследовано от вариационного шаблона, состоящего из lambdas
template< typename... T >
class inherit : public T...
{
public:
inherit(T... t) : T(t)... {}
};
int main() {
auto l1 = []() {};
auto l2 = []() {};
inherit<decltype(l1), decltype(l2)> test(l1, l2);
return 0;
}
Это фрагмент кода, сведенный к чистой сути. Visual Studio говорит «синтаксическая ошибка:« тип »в конструкторе inherit. Затем он выводит немного следов того, как он туда попал, и заканчивается словами «вы не можете построить экземпляр лямбды».
Мое предположение состоит в том, что расширение T (t) ... не расширяется правильно. Однако я вполне могу получить синтаксис неправильно.
EDIT: Извините, вопрос: я виноват здесь или нет? Если да, то какой правильный синтаксис?
ДОПОЛНИТЕЛЬНОЕ НАЙТИ: В соответствии с ответами, которые у меня были, это похоже на проблему с Visual Studio 2015 с ошибкой в этой области. В тестировании кажется его расширением, где параметры конструктора передаются базовым классам лямбда, которые имеют проблему. Следующие испытания работают в VS2015:
template< typename T1, typename T2, typename... T3 >
class inherit2 : public T3...
{
public:
inherit2(T1 t1, T2 t2) : T1(t1), T2(t2) {}
};
int main() {
auto l1 = []() {};
auto l2 = []() {};
inherit2<decltype(l1), decltype(l2), decltype(l1), decltype(l2)> test(l1, l2);
return 0;
}
Выглядит хорошо, clang ++ также принимает его. Что происходит, когда вы удаляете вариативность, но оставляете лямбды? – dyp
Я думаю, что Visual Studio имеет проблему, когда вы передаете лямбду в определенных случаях https://connect.microsoft.com/VisualStudio/feedback/details/727957/vc11-beta-compiler-fails-to-compile-lambda-key- Comparer-for-maps-and-sets http://stackoverflow.com/questions/25777396/passing-my-compar-function-to-stdmultiset-with-c11/25777512#comment43645224_25777512 – AndyG
Ваш код поддерживается с gcc 4.6 и clang 3.1 (как с начала 2012 года). Visual C++ работает на 3 года. – TemplateRex