转自 http://blog.sina.com.cn/s/blog_6a7439b30100vfib.html
文章
在模板中输入输出流的重载,若使用友元在类内声明,在类外实现,那么链接时就会报错,可以使用三种方式来实现输入输出流的重载。
{
}
那么输入输出流重载为什么不能在类内声明,类外实现呢??因为模板比较特殊,若果在模板类外实现重载的话:
template<class T>
ostream& operator<<(ostream& out,Test<T>& t)
{
} //--------------------------------------------
上面正好是函数模板的定义,而我们知道操作符重载函数不是类的成员函数,因此此处相当于定义了一个新 的函数模板(不同于类中的friend ostream& operator<<(ostream& out,Test<T>& t) )。但若去掉template<class T> ,函数中的参数Test<T>就不知是什么类型,所以不能在模板类内声明,类外实现操作符重载。
template<class T>
ostream& operator<<(ostream& out,Test<T>& t)
{
} //--------------------------------------------
template<class T>
istream& operator>>(istream& in,Test<T>& t)
{
}//---------------------------------------------
int
{
}
三、使用过渡函数
#include "stdafx.h"
#include
using
template<class
class
{
};//-----------------------------------------------------------------
template<class T,class CharT,class CharTraits>
basic_ostream<CharT,CharTraits>& operator<<(basic_ostream<CharT,CharTraits>& out,const Test<T>& t)
{
}//------------------------------------------------------------------
template<class T,class CharT,class CharTraits>
basic_istream<CharT,CharTraits>& operator>>(basic_istream<CharT,CharTraits>& in,Test<T>& t)
{
}//------------------------------------------------------------------
int
{
}