2015-01-14 7 views
10

У меня есть код, который работает под 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; 
} 
+2

Выглядит хорошо, clang ++ также принимает его. Что происходит, когда вы удаляете вариативность, но оставляете лямбды? – dyp

+0

Я думаю, что 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

+3

Ваш код поддерживается с gcc 4.6 и clang 3.1 (как с начала 2012 года). Visual C++ работает на 3 года. – TemplateRex

ответ

0

Это компилятор. A more recent MSVC, v. 19.00.23106.0 с июля 2015 года, принимает ваш пример как есть.

Возможно, синтаксис инициализации синтаксиса T{t}... помог бы. Тем не менее, я не могу найти подходящий онлайн-компилятор.

 Смежные вопросы

  • Нет связанных вопросов^_^