【C++ template 笔记】 Chapter 3

Posted on 2008-10-25 11:24  活着就是幸福  阅读(248)  评论(0编辑  收藏  举报

3 类模板

3.1类模板声明

       1.可以使用typename 或者class 关键字,不能使用struct

       2.在头部放置template<typename T [,…]>

       3.使用模板类作为类型来声明时,要使用classname<T>的形式

       4.定义类成员函数时应该说明是函数模板(使用template<typename>

        同时使用类模板的完全类型限定

       【插曲:源代码说明不可能实现完全异常安全版本的可返回pop函数】

       5.通过在类内定义可以实现类模板的成员函数内联

       6.类模板成员函数不会仅仅以返回值不同而同时存在

 

3.2 类模板的使用

       1.只有被调用的成员函数才会被实例化(who will be instantiated

       2.只有成员函数被使用的时候才会实例化 (when they are instantiated)

              原因:1.节省时间和空间

                      2.某些内部不支持某些操作的类型参数仍然也可以使用这个模板,

                            只要避免调用不支持的操作

       3.如果类模板内部有静态成员,编译器会为每种类型实例化一次

4模板参数可以是任何值,包括模板模板参数

5.类似于vector<vector<T> >问题。(vc2005已经解决了这个问题,g++会提示替换成> >

3.3 类模板特化

       1.类模板特化可以为某些特定类型改变或修正操作

       2.如果特化类模板则必须特化所有成员函数,如果只特化了单个成员函数,就不能再

        特化整个类

       3.特化类模板需要前置template<>和在类名后紧跟着指定某些特化类型

4.成员函数特化无需加template<>,但是模板的参数必须被指定

3.4 部分特化

3.5 默认模板实参

       1.模板可以定义默认参数,默认参数可以使用模板

       2.加默认参数使用T = …的方式

       3.成员函数模板在类模板外定义的话需要完整的参数列表,但默认参数不需要加

总结:

1.类模板内只有被调用的成员函数才被实例化