1. 模板定义时,<>中的虚拟类型参数不能为空。(因为我们使用模板就是希望使用模拟类型代替其它的类型,如果我们不定义就没有意义了)
2. 无论是定义函数模板还是类模板,其实template定义与后面使用虚拟类型的类或者函数,是一条语句,也就是说,中间不能有;,但是可以写在一行,也可以分行写。
// 写在一行
template <typename T, typename T2> void printS(T& a, T2& b) {cout << a << endl;cout << b << endl;
}// 分行写
template <typename T, typename T2>
void printS(T& a, T2& b) {cout << a << endl;cout << b << endl;
}
3. 所以说template其实就是说明下面的函数或者类要使用模板了,这也说明,如果一个函数中想要使用模板,就需要在前面使用template定义。(并不是只在代码中定义一次就行,只要使用就得定义)
4. 在函数模板中说道,函数的声明和函数的定义的前面都需要加template定义,此时我们在<>中的虚拟类型名应该保持一致。(因为表示的是同一个函数,自然相应的类型也应该相同了)
5. <> 中用于声明类型和传入类型,()中用于声明参数和传入参数。我们在使用模板时,就像传函数实参一样,使用<>传入类型实参,实例化声明的类型。
当然在调用函数模板的时候,编译器可以通过函数的参数(自动)实例化虚拟类型。 前提是,参数使用了对应的虚拟类型才行,否则还是得使用<>显示的传入。
6. 如果子类和父类都是模板类,那么我们在子类继承父类的时候,可以使用子类的虚拟类型来实例化父类中的类型参数。
7. 我们在<>中定义虚拟类型的时候,也可以使用class,当然使用typename更好。
例如: template <typename T> 和 template <class T>都是可以的。
那么是为什么呢? 因为: 模板是c++后来提出的,最开始就使用了class来作为定义虚拟类型,后来为了和类区分,就新增了typename关键字来定义,所以两种都支持但是建议使用typename。
8. 我们将使用了模板的函数作为友元时,在调用函数时建议进行显示调用(调用时使用<>传入类型)