Вот сокращенный пример без каких-либо шаблонов:
struct A { };
struct B { };
struct C : A, B { };
C x(A{}, B{}); // error
C y{A{}, B{}}; // ok
Проблема: C
- это агрегат, поэтому вы можете использовать агрегатную инициализацию для инициализации его компонентов. Вот почему y
работает. Но C
является агрегатом, у него нет конструкторов, что пытается сделать инициализация x
. Нет такого подходящего конструктора, следовательно, он не работает. Обратите внимание, что в C ++ 20 x
также будет работать, потому что мы сможем выполнить агрегатную инициализацию с круглыми скобками.
Чтобы получить объявление x
для компиляции, добавьте конструктор:
struct C : A, B {
C(A a, B b) : A(a), B(b) { }
};
Или для исходной задачи:
template<class... Ts>
struct overloaded : Ts... {
overloaded(Ts... ts) : Ts(std::move(ts))... { } // <==
using Ts::operator()...;
};
Или просто придерживайтесь агрегатной инициализации, поскольку это более явно то, что мы делаем здесь.