1、模板是类型安全的。
2、template<class T> 为了与定义类的class区分,用typename来定义类型参数。template<typename T>。T可以随便用其他占位符。
3、函数模板
template <typename T1, typename T2, ...> 返回类型 函数名(参数列表) {
...
}
模板参数名的作用域仅限于函数模板范围内,且每个模板参数要在函数的形参列表中至少出现一次。 可以定义函数的形参、返回值、局部变量等。
a.不允许template语句与函数模板定义之间有其他语句。
b.用模板创建模板函数、模板类时,编译器必须掌握函数模板/类成员函数模板的确切定义,必须把模板的声明和定义保存在同一文件中,通常保存在同一个头文件中
c.模板实例化过程中,不会进行任何形式的隐式类型转换。(可提前强制转换)
当编译器遇到函数模板的调用时,才会根据实参的具体类型,推断并确定模板参数的数据类型,并替换掉函数模板中的模板参数,生成函数代码 —— 模板的实例化。生成的函数 —— 模板函数。
4、显示指定函数模板实例化的类型参数:
template<typename T>
T min(T a, T b) {
...
}
double a = 1.0;
float c = 2.0;
min<double>(a, c);
实际调用参数类型写在调用函数名后面的“< >”中。
5、可以typename与实际的类型混用
template<typename T, int n>
void Sort(T a[n]) {
...
}
template<typename T1>
void display(T&a, int n) {
...
}
在调用函数模板时,只能向飞类型模板参数传递常数,不能传递变量。
int m = 7;
int a[] = {13,19,35,98,16,21,23};
Sort<int, m>(a); // error:模板中<typename T, int n>。m对于n,只能用常数。
display(a, m); // 正确。m对于int n。
——《C++面向对象程序设计(杜茂康)》C7