У меня есть код, который работает в GCC, но не компилируется в Visual Studio 2015 (который, как я понимаю, находится в разработке, но я думаю, что эта область должна быть реализована).
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 сообщает «синтаксическая ошибка:« тип »» в конструкторе наследования. Затем он извергает небольшой след того, как он туда попал, и заключает, что «вы не можете создать экземпляр лямбды».
Я предполагаю, что расширение T(t)... расширяется неправильно. Однако я вполне могу ошибаться в синтаксисе.
РЕДАКТИРОВАТЬ: Извините, вопрос: я виноват здесь или нет? Если да, то каков правильный синтаксис?
ДОПОЛНИТЕЛЬНЫЙ ВЫВОД: в соответствии с ответами, которые я получил, похоже, что это проблема с 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;
}
using Ts::operator()...;
, вам придется наследовать через дерево или каким-либо образом линейно, если вы хотите создать тип, который является переопределением лямбда-выражений. Кстати, вам не хватает: public T1, public T2
в ваших работах на примере VS2015? - person Yakk - Adam Nevraumont   schedule 15.06.2015using T::operator()
, что требует линейной (или древовидной) структуры наследования. Затем вы можете вызвать их все и позволить разрешению перегрузки разобраться с этим. В противном случае вы можете засунуть их вstd::tuple
, если вам просто нужен пакет лямбда-выражений. - person Yakk - Adam Nevraumont   schedule 15.06.2015