- 类模板(Class Template)
- 函数模板(Function Template)
1.类模板定义:
template<class T1,class T2,....>
class A{
...
//在类的定义中可以使用Ti
};
使用时,应为所有的Ti提供类型,如:A<int,float> a;
2.函数模板的定义:
template<typename T1,typename T2,...>
return_type func_name(parameters){
...
//在函数体中可以使用数据类型参数
}
使用时,直接 函数名(实参)
编译器可以根据调用时传递的参数来自动推演数据类型,所以要注意类型的一致性,如果同一个T推演出来的类型不一致,则会出现错误。
这里又有两种情况:
(1)模板类型参数
用class或typename指定模板参数,这里的模板参数表示类型,如:
template <class U , typename T> calc(const T&,const U&);
(2)非类型模板参数
非类型参数表示一个值而不是一个类型。当一个模板被实例化时,非类型参数被一个用户提供的或编译器推断出的值所替代,这些值必须是常量表达式,从而允许编译器在编译时实例化模板。
如:
template<unsigned N,unsigned M>
int func(int (&a)[N],int (&b)[M]){
//...
}
注意: 在模板定义中,模板参数列表(即<>中的列表)不能为空。