学习记录--c++怎么正确在模板类中使用操作符重载作为友元函数

最近学习数据结构,书本上把插入操作符重载作为链表类的友元函数,使其直接能输出链表内容,可是编译时总报错说友元有问题,代码示例如下:

#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;
      }

猜你喜欢

转载自blog.csdn.net/qq_39785575/article/details/80079846