template<typename T>
class A
{
public:
T add(T a,T b){return a+b;}
T Mul(T a,T b){return a*b;}
};
template<>
class A<int>
{
public:
int add(int a,int b){return a*b;}
};
typedef A<int> B;
template<typename T>
T Compare(T a,T b){return a-b;};
template<>
int Compare<int>(int a,int b){return a-b;}; //特化版本;
int Compare(const char*a,const char*b){return strcmp(a,b);}; //重载版本;
template<>
const char* Compare<const char*>(const char*a,const char*b){return NULL;}; //特化版本;
int main()
{
B temp;
int nRet = temp.add(5,6);
//nRet = temp.Mul(5,6); //编译失败,把class A<int> 定义删除后,编译通过;
Compare<int>(4,5); //特化版本存在时进入特化版本中,否则进入常规模板中;
const char*a = NULL;
const char*b = NULL;
Compare(1.2,4.5); //常规模板实例中;
Compare(a,b); //重载版本中,当重载版本不存在时调用特化版本,特化版本不存在时调用常规模板实例;
Compare<const char*>(a,b); //特化版本中;
return 0;
}
内容比较复杂,多多调试看看
具体介绍可查看C++ Primer模板特化的相关章节