C++ 模板专题.pdf:
十、友元和类模板
1、类模板中有普通友元函数,友元类,模板友元函数和友元类,普通友元函数和友元类不做介绍。
2、可以建立两种类模板的友元模板,即约束型的友元模板和非约束型的友元模板。
3、非约束型友元模板:即类模板的友元模板类或者友元模板函数的任一实例都是外围类的任一实例的友元,也就是外围类和友元模板类或友元模板函数之间是多对多的关系
4、约束型友元模板:即类模板的友元模板类或友元模板函数的一个特定实例只是外围类的相关的一个实例的友元。即外围类和友元模板类或友元模板函数之间是一对一的关系。
5、约束型友元模板函数或友元类的建立:比如有前向声明:
template<class T1>
void g(T1 a);
template<class T2>
void g1();
template<class T3>
class B;
//则
template<class T>
class A
{
friend void g<>(T a);
friend void g1<T>();
friend class B<T>;
};
就建立了三个约束型友元模板,其中g和g1 是函数,而B 是类。注意其中的语法。
这里g<int>型和类A<int>型是一对一的友元关系,g<double>和A<double>是一个一对一的友元关系。
6、非约束型友元模板函数或友元类的建立:非约束型友元模板和外围类具有不同的模板形参,比如
template<class T>
classA
{
template<class T1>
friend void g(T1 a);
template<class T2>
friend class B;
};
注意其中的语法,非约束型友元模板都要以template开头。要注意友元模板类,在类名B的后面没有尖括号。
7、不存在部分约束型的友元模板或者友元类:比如
template<class T>
class A
{
template<class T1>
friend void g(T1 a, T b);
template<class T3>
friend class B<T3,T>;
}:
其中函数g具有template<class T1,class T2>void g(T1 a,T2 b)的形式。其中的函数g 试图把第二个模板形参部分约束为类A的模板形参类型,但是这是无效的,这种语法的结果是g 函数的非约束型类友元函数,而对类B的友元声明则是一种语法错误。
C++ 模板专题.pdf:
http://download.csdn.net/detail/fdcumt/5794207