模板函数参数包不在列表末尾

template function parameter pack not at the end of the list

以下代码无法同时在 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;
}

可变参数模板参数是贪婪的,因此如果您尝试为具有可变参数的模板显式指定模板参数,一旦显式参数开始分配给可变参数包,所有剩余参数都会分配给该参数包.在这种情况下 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