函数模板
template <class T> void swap(T& a, T& b){}
当调用模板函数时类型T就会被“被调用时的实参类型”自动所代替,比如swap(a,b)其中a和b是int 型,这时模板函数swap中的形参T就会被int 所代替。不能在函数调用的参数中指定模板形参的类型,对函数模板的调用使用实参自动推演来进行
类模板
类模板形参不存在实参推演的问题,必须通过尖括号表明 A
template<class T> class A{
public:
T g(T a,Tb);
A();
};
template<classT> A<T>::A(){}
template<classT> T A<T>::g(T a,T b){
return a+b;
}
模板的形参
类型模板形参:类型形参由关见字class或typename后接说明符构成,如template<class T> void h(T a){};
其中T就是一个类型形参
非类型模板形参:模板的非类型形参也就是内置类型形参,
- 如template<class T, int a> class B{};其中int a就是非类型的模板形参。
- 如果有int b,这时A<int, b> m;将出错,因为b不是常量。
- 如果const int b,这时A<int, b> m;就是正确的,因为这时b是常量。 非类型形参一般不应用于函数模板中。
可以为类模板的类型形参提供默认值,但不能为函数模板的类型形参提供默认值。函数模板和类模板都可以为模板的非类型形参提供默认值
template<class T1, class T2=int>class A{};为第二个模板类型形参T2提供int型的默认值。
在类模板的外部定义类中的成员时template 后的形参表应省略默认的形参类型。
比如template<class T1, classT2=int> class A{public: void h();};
定义方法为template<class T1,class T2> voidA<T1,T2>::h(){}