在类模板中可以出现三种友元声明:
(1)普通非模板类或函数的友元声明,将友元关系授予明确指定的类或函数。
(2)类模板或函数模板的友元声明,授予对友元所有实例的访问权。
(3)只授予对类模板或函数模板的特定实例的访问权的友元声明。
(1)普通友元:
template<class T>
class A{
friend void fun();
//...
};
此例中fun可访问A任意类实例中的私有和保护成员
(2)一般模板友元关系
template<class type>
class A{
template<classT>
friend void fun(T u);
//...
};
这时友元使用与类不同的模板形参,T可以是任意合法标志符,友元函数可以访问A类的任何类实例的数据,即不论A的形参是int,double或其他都可以。
(3)特定的模板友元关系
template <class T> void fun(T,u);//对与特定的模板友元关系,这里的声明是必须的
template<class T>
class A{
friend voidfun<T>(T u);//这里也可以是friend void fun<char>(char u);
//...
};
此时fun只有访问类中特定实例的数据。换句话说,此时具有相同模板实参的fun函数与A类才是友元关系。即假如调用fun时其模板实参为int,则它只具有A<int>的访问权限。当然friendvoid fun<T>(Tu);中<>中的T可以是任意类型,比如int,double等