template<typename T1,typename T2>
class Test{
public:
Test(T1 a,T2 b):a(a),b(b){cout<<"normal"<<endl;}
private:
T1 a;
T2 b;
};
//A
template<>
calss Test<char,int>{
public:
Test(char a,int b):a(a),b(b){cout<<"full"<<endl;}
private:
char a;
int b;
}:
//B
template<typename T>
calss Test<T,char>{
public:
Test(T a,char b):a(a),b(b){cout<<"partial"<<endl;}
private:
T a;
char b;
};
template<typename T1,typename T2>
void fun(T1 a,T2 b){cout<<"normal"<<endl;}
//C
template<>
void fun<char,int>(char a,int b){cout<<"full"<<endl;}
//D
template<typename T>
void fun<T,char>(T a,char b){cout<<"partial"<<endl;}
- 模板特化是将模板中的模板参数指定为特定的类型,模板特化后可以针对特定类型实现特定逻辑,而不拘泥于通用模板。模板特化丰富了模板的使用方式。
- 模板特化分为全特化和偏特化。模板全特化是将所有模板参数进行特化,特化后所有的模板参数都有确定的类型;偏特化是将部分模板参数进行特化,特化后只有部分模板参数指定了类型,因此模板偏特化后仍然是一个模板。
- 程序中首先定义了一个包含两个模板参数的类模板,然后通过指定两个模板参数的类型对模板进行全特化,再通过指定其中一个模板参数的类型对模板进行偏特化,因此类模板的相关代码没有问题。
- 之后程序定义了一个包含两个模板参数的函数模板,然后对函数模板进行全特化,再对函数模板进行偏特化。但是C++规定,函数模板只能全特化,不能偏特化,如果想实现偏特化的效果,可以通过函数重载或模板重载的方式解决。因此D段代码错误。