【c++】<1>正确在模板类中使用操作符重载作为友元函数

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

#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;
      }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值