模板功能参数包不在列表末尾

时间:2019-03-08 12:02:56

标签: c++11 templates c++17 function-templates

以下代码在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 个答案:

答案 0 :(得分:1)

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