模板可以具有默认参数。在实例化(具体化)这样一个具有默认参数的模板时,如果你不显式地指定参数,编译器会插入这些默认参数。标准库(Standard Library)使用这一特性非常多,(比如说)这样就能够使你忽略掉 STL 容器的分配器(allocator)和traits classes。
下面的类模板有两个模板参数T1 和 T2,每个参数有一个默认值:
template <
class T1=char, class T2=int >
class C
{
public:
C (T1 t1, T2 t2) : m1(t1), m2 (t2) {}
private:
T
T
//..
};
如同一般的具有默认参数值的函数一样,如果一个模板参数具有一个默认值,所有后续模板参数必须也要具有默认参数:
template
<class T1=int, class T2> class X; // error
template <class T1, class T2=int> class Y; // OK
实例化
在实例化这样的模板时,你可以忽略一些或全部具有默认值的参数,或者不忽略具有默认值的参数。下面的例子展示了模板 C 的两个具体化过程。第一个实例显式地指定了所有的参数;第二个忽略了最后一个参数:
int main()
{
C < int, double > c1(0,0.0); // no defaults used
C < bool > c2(true, 6); // OK, second arg defaults to int
}
在具体化时,如果模板的所有参数都具有默认值并且都使用默认值,那么要在模板的名称后提供一对空的尖括号。忽略掉空的尖括号是一个错误:
C e3( 'a',
8); //error; missing < >
C <> e4 ('a', 8); //OK, instantiates C <char, int>