明确指定位于模板参数包之后的默认模板参数

时间:2015-12-21 17:24:20

标签: c++ templates variadic-templates

为什么我不能在下列情况下明确指定d

#include <iostream>

template< typename a, typename b = int, typename ...c, typename d = int >
int
f(a, b, c..., d)
{
    return sizeof...(c);
}

int
main()
{
    std::cout << f< int, int, int, int/*, char*/ >(1, 2, 3, 4, 'd') << std::endl;
    return 0;
}

如果我取消注释上一个模板参数,那么我期望输出2,但我得到一个硬错误:

main.cpp:14:18: error: no matching function for call to 'f'
    std::cout << f< int, int, int, int, char >(1, 2, 3, 4, 'd') << std::endl;
             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:6:1: note: candidate function not viable: requires 6 arguments, but 5 were provided
f(a, b, c..., d)
^
1 error generated.

在这种情况下拒绝它的规则是什么?

1 个答案:

答案 0 :(得分:5)

因为包很贪婪。因此,char实际上是c的一部分,并且您希望提供与d相关联的参数,由于默认情况,该参数的类型为int