c++的模板技术由类模板和函数模板共同构成,掌握其用法至关重要。前一节已讲解函数模板,接下来将深入介绍类模板的具体使用方法。
1、 举例说明
2、 除了函数模板,还能声明类模板。例如,可用来实现一个堆栈结构。
3、 只有相同类型类模板T的对象之间才能进行拷贝构造。
4、 };
立即学习“C++免费学习笔记(深入)”;
5、 {}
6、 {}
7、 {
8、 }
9、 {
10、 }
11、 {
12、 }
13、 {
14、 }
15、 {
16、 }


17、 定义类模板后,按规范调用其方法即可。
18、 {
19、 }
20、 模板实参可为任意类型,不限于int。

21、 成员函数在调用时才会被实例化。
22、 类模板中的静态数据成员在每种实例化类型中都会独立生成一份,不同类型的实例拥有各自的静态成员。静态成员函数与数据成员仅在同一类型实例间共享。
23、 };
24、 声明一个类型为A的变量a,这将触发模板类A中针对std::string类型的实例化过程。
25、 声明三个A类型的对象b、c、d,它们共享类模板特化后的静态成员n和count()函数,其中n被实例化一次,由所有对象共同使用。
26、 获取类型为int的A类中count函数的返回值,并将其赋给变量n。
27、 n 等于 b 的计数,调用的是 A 类中的 count 方法。
专业级别的大型网站建站产品,JAVA技术的CMS管理系统,ospod提供上百套专业模板供您选择,包括审批工作流,流量统计和流行网络应用,是公司企业建设专业网站的首选产品,也使用于专业建站人士完成复杂网站项目。管理地址cmsadmin登陆用户名:ospod 密码:ospod1234
28、 必须明确指定模板参数,否则无法确定实例化版本,因此该计数调用方式错误。

29、 类模板的局部应用
30、 由于成员函数仅在被调用时才会进行实例化,因此模板参数只需支持实际使用到的操作,而无需具备所有可能的操作。例如,Stack类中定义了一个printOn函数,用于对每个元素调用operator
31、 ...
32、 };
33、 {
34、 }
35、 定义一个存储整数对的栈,由于标准库中的pair未提供输出操作符重载,因此无法直接打印其内容。
36、 s.printOn(std::cout); // 错误:该元素类型未重载输出运算符

37、 与其通过printOn函数打印对象,不如重载operator
38、 ...
39、 }
40、 };

41、 类外定义友元时,若类模板参数不可见,将导致复杂性显著增加。
42、 可采用两种方式:隐式声明新函数模板,或调整模板参数以实现区分。
43、 …
44、 };
45、 在类外部定义模板,形式为template。
46、 {
47、 }
48、 将友元声明为模板,若其参数含类模板,则需先对该类模板进行前置声明。
49、 模板类型T在重载operator
50、 之后便可将它声明为模板类型T的友元,使其能够访问私有成员。
51、 …
52、 };
53、 在类外部定义模板类型T的实现方法。
54、 {
55、 }

56、 函数仅在调用时才会实例化,即使元素未定义operator
57、 栈中存储整数对,由于标准库的整数对未定义输出操作符,因此无法直接输出其内容。需通过其他方式访问和处理栈内元素。
58、 输出操作符不适用:元素类型未重载operator









