登陆

c++自定义类重载输出运算符时不使用friend关键字产生错误的原因是什么?

我使用的编译器位vs2015,尝试写一个sales_data类,定义了该类的输出函数,漏掉了friend关键字。代码如下:

ostream &operator<<(ostream &os,sales_data aaa)
{
    os <<aaa.isbn()<<" "<<aaa.gxsl() <<" "<<aaa.gsj()<<" "<<aaa.gzj();
    return os;
}

产生错误:d:cpplearnc2015consoleapplication4consoleapplication4a.cpp(14): error C2804: 二进制“operator <<”的参数太多
1>d:cpplearnc2015consoleapplication4consoleapplication4a.cpp(14): error C2333: “sales_data::operator <<”: 函数声明中有错误;跳过函数体
1>d:cpplearnc2015consoleapplication4consoleapplication4a.cpp(40): error C2398: 元素“3”: 从“double”转换到“int”需要收缩转换
1>d:cpplearnc2015consoleapplication4consoleapplication4a.cpp(40): warning C4244: “参数”: 从“double”转换到“int”,可能丢失数据
加上关键字friend,编译器不报错。
友元为了可以访问其它类的私有成员,与上面错误很难联系,网上没有找到相应问题。谁能给点提示,谢谢各位。


# C++
高洛峰高洛峰1846 天前473 次浏览

全部回复(1)我要回复

  • 三叔

    三叔2016-10-25 11:51:38

    你仔细想一下,你这个重载运算符是定义在函数里的成员函数,还是类外的独立的函数呢?这两种方式的参数表是不一样的哦。

    回复
    0
  • 取消回复发送