#include "iostream"//包含头文件
using namespace std;//指定缺省的命名空间
//约束模板友元;模板类实例化时,每一实例的类对应一友元函数
template <typename T>
void show(T& a); //在模板类的定义前面定义前面,声明友原函数模板
template<class T1,class T2>
class AA //模板类AA
{
public:
friend void show<>(AA<T1,T2>&a); //第二步,
T1 m_x;
T2 m_y;
public:
AA(const T1 x,const T2 y):m_x(x),m_y(y){}
// friend void show(const AA<int,string>& a);
// friend void show(const AA<char,string> &a);
};
template <typename T>
void show(T &a)
{
cout<<"通用:x= "<< a.m_x<<",y= "<<a.m_y<< endl;
}
template <>
void show(AA<int,string>&a)
{
cout <<"具体<int,string>: x= "<<a.m_x<<",y= "<<a.m_y<< endl;
}
void show(const AA<int,string>&a)
{
cout<<"x = "<<a.m_x<<" ,y= "<<a.m_y<<endl;
}
void show(const AA<char,string>&a)
{
cout<<"x= "<<a.m_x<<",y= "<<a.m_y<<endl;
}
int main()
{
AA<int,string> a1(88,"来了来了。");
show(a1);//将使用具体化的版本。
AA<char,string> a2(88,"收拾收拾。");
show(a2);//将使用通用的版本。
AA<int,string> b1(88,"来了来了。");
show(b1);//将使用具体化的版本。
AA<char,string> b2(88,"收拾收拾。");
show(b2);//将使用通用的版本。
}
输出:
具体: x= 88,y= 来了来了。
通用:x= X,y= 收拾收拾。
具体: x= 88,y= 来了来了。
通用:x= X,y= 收拾收拾。
发表回复