关于类模板的友元函数zz

以下内容转载自:

http://www.cppblog.com/zhaoyao91/archive/2011/03/31/143148.html 

注意:第三种方法本人验证编译有问题。(windows+codeblocks,将class A内operator <<后面的"<T>"去掉后正常,声明非模板友元)

 

 

  对类建立友元函数很容易。但是迁移到模板上却容易出现让人摸不着头脑的连接错误。
  层次不够,不做分析,单纯介绍两种为类模板定义友元函数的方法

  1 封闭型

template <  typename T  >
class  MyClass
{
    friend 
void function( MyClass< T > &arg )
   
{
        
    }

}
;
  要点:友元函数定义在模板体内。

       2 开放型
template <  typename T  >
class  MyClass
{
    template
< typename C >
    friend 
void function( MyClass< C > &arg );
}
;

template
<  typename C  >
void  function( MyClass <  C  >   & arg )
{
    
}
  要点:模板体内要另建模板。 
  
  3 告诉编译器声明的设个是模板
#include  < iostream >
using   namespace  std;

template 
<  typename T  >
class  A
{
    friend ostream 
&operator<< < T >( ostream &const A< T > & );
}
;

template 
<  typename T  >
ostream 
& operator <<  ( ostream  & output,  const  A <  T  >   & a )
{
    output 
<< "重载成功" << endl;
    
return output;
}


int  main()
{
    A
< int > a;
    cout 
<< a;
}
要点:显示地在重载的运算符或者函数后面加上模板声明< T >, 告诉编译器友元函数是一个类型一致的模板。

 建议:
            如果希望使用函数与模板特化的类型相对应,则使用方法3(模板显示声明)
            如果希望使用函数与模板特化的类型相独立,则使用方法2(二重模板)
            简短的内联函数使用方法1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值