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.类模板内只有被调用的成员函数才被实例化
-----------------------------------------------------------
每天进步一点