Пакет параметров функции шаблона находится не в конце списка - PullRequest
0 голосов
/ 08 марта 2019

Следующий код не компилируется как на g ++, так и на clang ++ с разными сообщениями об ошибках.В частности, это вторая строка main, которая вызывает ошибку.

Я не понимаю, почему, поскольку нет ничего неоднозначного.Функция имеет два аргумента, что означает, что пакет шаблонов должен иметь ровно два аргумента, и все типы должным образом указаны явно.

Любое объяснение?

#include <iostream>
enum A {A1,A2};
template <typename...Ts, A a=A2>
void foo(Ts...ps) { (std::cout << ... << ps); }

int main()
{
    foo<int,int>(1,2);     // this compiles
    foo<int,int,A2>(1,2);  // this does not compile
    return 0;
}

1 Ответ

1 голос
/ 26 марта 2019

Аргументы шаблона 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
...