今天在写单向链表实现线性表的时候打算重载输出运算符用来将线性表输出,结果无奈又遇到了问题。
大致代码如下
<pre name="code" class="cpp">
template<class T>
class chainList : public linearList<T>
{
friend ostream& operator<<(ostream & out, const chainList<T> & rhs);
public:
......
private:
......
};
//友元函数实现的实现
template<class T>
ostream & operator<<(ostream & out, const chainList<T> & rhs)
{
......
}
运行的时候编译器报错说 无法解析的外部符号
想来想去也只能使友元函数出了问题,于是果断百度了解了一下
友元函数虽然可以访问类内部的成员,但是它相对于类是独立的,它的实现不能依赖类。代码中用到模板类template<class T> 而在类内声明友元函数的时候也用到了<T>,所以此时友元函数是依赖于类的实现而实现的,编译器才会报错。
解决方法有两个
第一种:可以将友元函数的实现放在类的内部
第二种:在类的内部声明友元函数的时候在之前为它单独配一个模板类型,然后在外部实现
template<class T>
class chainList : public linearList<T>
{
template<typename U>
friend ostream& operator<<(ostream & out, const chainList<U> & rhs);
public:
......
private:
......
};
//友元函数实现的实现
template<typename U>
ostream & operator<<(ostream & out, const chainList<U> & rhs)
{
......
}