模板代码中的默认类型参数错误

时间:2010-09-29 17:14:42

标签: c++ templates

1)template <class T = int, class U = double> //compiles

2)template <class T, class U =double> //compiles

3)template <class T = int, class U> //fails

为什么1和2编译而3不编译?

3 个答案:

答案 0 :(得分:8)

出于同样的原因:

void f(int = 0, int);

失败。

无法使用第3版默认参数:

template<class T = int, class U> class B { ... };

B<, short> var; // ??? no such syntax

答案 1 :(得分:6)

(3)格式不正确,因为

C ++ 03 [Section 14.1/11]说

  

如果template-parameter具有默认的template-argument,则所有后续模板参数都应提供默认的模板参数

答案 2 :(得分:6)

如果你把它放到某个上下文中,第三种方式实际上可能是合法的,前提是先前已经给出了第二个默认值。

template <class T, class U = double>
struct X;

template <class T = int, class U> //here
struct X {};

int main()
{
    X<> x;
    X<float> y;
    X<char, char> z;
}