Аргументы шаблона Variadic являются жадными, поэтому, если вы попытаетесь явно указать аргументы шаблона для шаблона, который имеет переменный аргумент, после того, как явные аргументы начнут выделяться пакету вариадических переменных, все остальные аргументы будут выделены этому пакету.В этом случае A2
не является типом, поэтому, когда компилятор пытается выделить его для пакета Ts...
, это вызывает ошибку.
Вы можете перегрузить ваш шаблон, что позволит enum
бытьуказано в качестве первого параметра:
template <A a,typename...Ts >
void foo(Ts...ps) { std::cout << sizeof...(ps); }
template <typename...Ts>
void foo(Ts...ps) { foo<A2>(ps...); }
foo<int,int>(1,2); // this compiles
foo<A2,int,int>(1,2); // this compiles