局部特化并不会引入一个新的模板,它只对原来模板(基本模板)进行扩展。当查找类模板的时候,刚开始只会考虑基本模板。然而,如果在选择了基本模板之后,还发现了一个”模板实参能够和实例化体的模板实参进行完全模式匹配“的局部特化,那么将会实例化该局部特化的定义,而不再实例化基本模板的定义。

#include<iostream>
using namespace std;
//基本模板
template<typename T>
class A{
public:
void f1(){
cout << "A::f1()" << endl;
}
void f2(){
cout << "A::f2()" << endl;
}
};

//先全局特化一个void*,防止a处的代码无限递归
template<>
class A<void*>{
public:
void f1(){
cout << "A::f1()" << endl;
};
void f2(){
cout << "A::f2()" << endl;
};
};

//局部特化
template<typename T>
class A<T*>{
private:
A<void*> impl;//a
public:
void f1(){
impl.f1();
}
void f2(){
cout << "A<T*>::f2()"<<endl;
}
};

int main()
{
A<int*> a;
a.f1();
a.f2();
}

A::f1()
A<T*>::f2()


函数模板只能被重载,重载的函数模板是一个分开的模板,它们之间是完全独立的。

#include<iostream>
using namespace std;
template<typename T>
T const& myMin(T const& t1,T const& t2){
return t1>t2?t1:t2;
}

template<typename T>
T* const& myMin(T* const& t1,T* const& t2){
return *t1>*t2?t1:t2;
}

int main(){
int a=1,b=2;
cout << *myMin(&a,&b);//call T* const& myMin
}

2