今天写一个类模板的时候模板类友元函数先是编译不能模板化,再是无法连接,通过看书终于解决了问题
首先模板类的友元函数分为三类:
1,非模板友元函数;
2,约束类模板友元函数,友元函数的类型取决于类被实例化的类型;
3,非约束类模板友元函数,友元的所有具体化都是类的每一个具体化的友元。
首先来看第一类友元函数–非模板友元函数
template<class T>
class HasFriend
{
public:
friend void friendFunc1();
friend void friendFunc2(HasFriend<T> &);
}
void friendFunc2(HasFriend<int> & HF){....};
void friendFunc2(HasFriend<double> & HF){....};
类中有一个friendFunc1()友元函数 这个函数是模板所有实例的友元函数 ,它可以访问全局变量,可以创建HsaFriend类实例来访问所创建的实例内部变量,可以访问模板类的静态成员。
类中含有一个friendFunc2()友元函数,这个函数使用了了一个模板作参数。所以我们必须对这个函数显示具体化(你要用到的类型都得初始化一次)。我最开始的时候就没有这样做然后卡了很久。
接着来看第二类友元函数–约束类模板友元函数
template<class T> void friendFunc1();
template<class T> void friendFunc2(T &);
template<class T>
class HasFriend
{
public:
friend void friendFunc1<T>();
//friend void friendFunc2<HasFriend<T>>(HasFriend<T> &);
friend void friendFunc2<>(HasFriend<T> &);
}
void friendFunc1()
{
.....
}
template<class T>
void friendFunc2(T &)
{
'''''
}
首先你可以看到类的上部有函数friendFunc1() friendFunc2(T &)函数的定义,这两个函数是模板函数。
然后再类中看两个函数的声明
首先看friend void friendFunc1();这个声明;这个是必须加的
因为它没有参数,所以必须指明是friendFunc1函数模板的一个实例化,注意这个T是类模板的T而不是函数模板的T,这里是将函数进行实例化。
再看 friend void friendFunc2<>(HasFriend &);这个
template<class T>
class HasFriend
{
public:
template<class T> friend void friendFunc1(T &);
}
这一类在类中定义,他可以访问所有的具体化实例