目录1 递归使用模板2 多个类型参数的模板3 默认类型模板参数本文学习类模板的其他一些特性。在使用类模板时可以将常规类的技术用于模板类即模板类可以用作基类也可以用作组件类还可以作为其他模板的类型参数。1 递归使用模板例如对于上篇文章《类模板》中的数组模板可以定义这样一个对象ArrayTPArrayTPdouble, 5, 10ar3;ar3是一个包含10个元素的数组其中每个元素都是一个包含5个double元素的数组。与它等价的常规数组声明如下double ar3[10][5];这里请注意在模板句法中维的顺序与等价的二维数组相反。2 多个类型参数的模板模板可以包含多个类型参数C标准模板库中的pair模板就使用了两个类型参数。以下为有两个类型参数的模板类示例代码#pragma once #include iostream #include string template class T1, class T2 class Mypair { private: T1 a; T2 b; public: T1 first(); T2 second(); T1 first() const { return a; } T2 second() const { return b; } Mypair(const T1 a_val, const T2 b_val) :a(a_val), b(b_val) {} Mypair() {}; }; template class T1, class T2 T1 MypairT1, T2::first() { return a; } template class T1, class T2 T2 MypairT1, T2::second() { return b; }类模板说明方法first() const和second() const用于输出存储的值且这两个方法返回的是Pair数据成员的引用因此可以通过赋值重新设置被存储的值。下面的程序为使用类模板的调用程序#include iostream #include string #include Pair.h int main() { Mypairstring, intratings[5] { Mypairstring, int(Liiy, 1), Mypairstring, int(Jack, 2), Mypairstring, int(Tom,3), Mypairstring, int(Andy,4), Mypairstring, int(Lucy,5) }; int joints sizeof(ratings) / sizeof(Mypairstring, int); cout name: \t test result\n; for (int i 0; i joints; i) { cout ratings[i].first() : \t ratings[i].second() endl; } ratings[3].second() 2; cout ratings[3].first() : \t ratings[3].second() endl; return 0; }调用程序说明main()函数中必须使用Mypairstring, int来调用构造函数并将它作为sizeof的参数。这是因为模板类的名称是Mypairstring, int不是Mypair。因此程序创建的是一个有5个Mypairstring, int对象的数组数组名为ratings。另外需要说明的是Mypairchar*, int与Mypairstring, int 是两个不同的模板类。下图为程序的输出结果3 默认类型模板参数可以为类模板中的类型参数提供默认值。比如Mypair类模板可以这样创建template class T1, class T2 int class Mypair { ... };如果省略T2的值编译器将使用int替代。Mypairstring, doublest1;///T1值为string, T2值为double Mypairstringst2;///T1值为string, T2值为int