C++98/03:
类模板可以有默认的模板参数
template<typename T,typename U = int, U N = 0>
struct Foo
{
//...
};
但不支持函数的默认模板参数:
template <typename T = int> // error in C++98/03: default template arguments
void func()
{
// ...
}
C++11:
上面的func函数可以编译通过。
-
当所有模板参数都有默认参数时,函数模板的调用 如同一个普通函数。
template <typename R = int, typename U> R func(U val) { return val; } int main() { func(97); // R=int, U=int func<char>(97); // R=char, U=int func<double, int>(97); // R=double, U=int return 0; }
-
但对于类模板而言,哪怕所有参数都有默认参数,在使用时也必须在模板名后跟随
<>
来实例化。template<typename T = int,typename U = int> struct Foo { T a; U b; }; //使用类模板 Foo<>::a; Foo<int,int>::b;
-
当默认模板参数和自行推导的模板参数同时使用时,若无法推导出函数模板参数的类型,编译器会选择使用默认模板参数;
-
如果模板参数即无法推导出来,又未设置其默认值,则编译器直接报错。
template <typename T, typename U = double>
void func(T val1 = 0, U val2 = 0)
{
//...
}
int main()
{
func('c'); //T=char, U=double
func(); //编译报错
return 0;
}