以下内容转载自:
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 )
{
}
} ;
要点:友元函数定义在模板体内。
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 )
{
}
要点:模板体内要另建模板。
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 >, 告诉编译器友元函数是一个类型一致的模板。
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;
}
建议:
如果希望使用函数与模板特化的类型相对应,则使用方法3(模板显示声明)
如果希望使用函数与模板特化的类型相独立,则使用方法2(二重模板)
简短的内联函数使用方法1