最近学习数据结构,书本上把插入操作符重载作为链表类的友元函数,使其直接能输出链表内容,可是编译时总报错说友元有问题,代码示例如下:
#include <iostream>
using namespace std;
template<class T> class linklist
{
private:
node<T> *first;
public:
friend ostream& operator<<(ostream &out,linklist<T> &list);
};
template<class T> ostream& operator<<(ostream &out,linklist<T> &list)
{
//重载输入流,用下面函数创建一个新的链表
list.creatlist(in);
return in;
}
友元函数虽然可以访问类内部的成员,但是它相对于类是独立的,它的实现不能依赖类。代码中用到模板类template 而在类内声明友元函数的时候也用到了,所以此时友元函数是依赖于类的实现而实现的,编译器才会报错。
查过之后找到解决这个问题有两个方法:
1、在类内声明友元函数时直接定义,如下:
#include <iostream>
using namespace std;
template<class T> class linklist
{
private:
node<T> *first;
public:
friend ostream& operator<<(ostream &out,linklist<T> &list)
{
list.showlist(out);
return out;
}
};
2、在类的内部声明友元函数的时候在之前为它单独配一个模板类型,然后在外部实现,如下:
#include <iostream>
using namespace std;
template<class T> class linklist
{
private:
node<T> *first;
public:
template<class U> friend ostream& operator<<(ostream &out,linklist<U> &list);
};
template<class U> friend ostream& operator<<(ostream &out,linklist<U> &list)
{
list.showlist(out);
return out;
}