У меня есть код, который работает под 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 говорит "синтаксическая ошибка:" тип "в конструкторе 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;
}