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
Run Code Online (Sandbox Code Playgroud)
为什么1和2编译而3不编译?
出于同样的原因:
void f(int = 0, int);
Run Code Online (Sandbox Code Playgroud)
失败.
无法使用第3版默认参数:
template<class T = int, class U> class B { ... };
B<, short> var; // ??? no such syntax
Run Code Online (Sandbox Code Playgroud)
(3) 是不正确的,因为
C++ 03 [ Section 14.1/11]说
如果template-parameter具有默认的template-argument,则所有后续模板参数都应提供默认的template-argument.
如果你把它放到某个上下文中,第三种方式实际上可能是合法的,前提是先前已经给出了第二个默认值.
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;
}
Run Code Online (Sandbox Code Playgroud)