1.template <class T> class Arry{}; Arry:是模板. Arry<int>:才是类. : 属于编译时替换。
2. 模板特例化:模板主要用于通用的功能:类或函数,但并不是每个都通用,总有一些特例存在(某些数据类型不支持通用的操作),因此,模板特例化是为了这么一些特例存在的。 类名<...>,函数名<...>, 尖括号在他们的后面,内部必须跟具体的类型(不带变量名),这就是特例化。(如同:函数重载的道理)
如:类的特例话template <> class A<char*>{} :A<char*> a; template<class T> class A<T,int>{} A<int,int> b;
函数成员特例话(如果该特例仅仅只是一个函数的差别,其他的构造、西沟都一样的话,我们可以选择部分函数特例(类似于函数重载)):
template<> void A<char*>::fun(char* c){} A<char*> a;a.fun();
全局函数的特例话:template <> void abc<char*>(char* a){} abc("132");
3.遵循原则:1 最佳匹配原则 2 指针优先原则
4 .有如下情况:
A; template <class T1,class T2> class pair{}; ----> pair<double ,double> pl;
B; template <class T1> class pair <T,int >{};===--->pair<double,int> p2;
C; template <> class pair<int,int>{}; -----------> pair<int,int> p3;
A; template <class T> class feeb{}; -------------->feeb<char>
B; template <class T1*>class feeb{};---------->feeb<char*>
A; template <class T1,class T2,class T3> class trio{}; ------>
B; template <class T1,class T2>class trio<T1,T2,T3>{};---->要求后面2个同类型的,来优先调用这个东西。
C; template <class T1> class trio<T1,T1*,T1*>{};
出错情况:
1. 定义时总是忘记了加 < >
2.模版特例化时,类名/函数名 后面加上“形参变量,晕死”,----应该“只有类型而已”