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不编译?
答案 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;
}