友元模板

 

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

 

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值