5D空间

学习总结与经验交流

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::

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

  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
posted on 2011-03-31 19:15 今晚打老虎 阅读(502) 评论(0)  编辑 收藏 引用 所属分类: 学习笔记

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理