易混概念:
函数模板:就是template<class t>...
模板函数:通过 函数模板 实例化出来的 函数。
(
1
)在定义模板时,不允许
template
语句与函数模板之间有任何其他语句。下面的模板定义是错误的:
template <typenameT>
int a;//错误,不允许在此位置有任何语句
T Max(T x,Ty){ … }
现象:
(
2
)不要把这里的
class
与类的声明关键字
class
混淆在一起,虽然它们由相同的字母组成,但含义是不同的。为了区别类与模板参数中的类型关键字
class
,标准
C++
提出了用
typename
作为模板参数的类型关键字,同时也支持使用
class
。如果用
typename
其含义就很清楚,肯定是类型名而不是类名。
(
3
)函数模板的类型参数可以不止一个,可根据实际需要确定个数,但每个类型参数都必须用关键字
typename
或
class
限定。
template <class T1,classT2,class T3>
T1 Func(T1 a, T 2 b, T3 c){ … }
(4)如果调用函数的形参类型与函数模板不匹配:
template <typename T>
T Max(T x, T y)
{
return x>y? x:y ;
}
Max(2, 2.3) // 出错, 因为 2.3 与 2 不属于同一种数据类型
编译错误:
PS: