模板函数参数包不在列表末尾
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
以下代码无法同时在 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