有问题超载<<类中的运算符和类的标题

时间:2014-01-26 23:25:54

标签: c++ class io operator-overloading

所以我正在研究一个分数类程序,我在重载输出运算符时遇到了一些困难。 主文件的相关位。

const fraction fr[] = {fraction(4, 8), fraction(-15,21),
                       fraction(10), fraction(12, -3),
                       fraction(), fraction(28, 6), fraction(0, 12)};

for (int i = 0; i < 7; i++){
    cout << "fraction [" << i <<"] = " << fr[i] << endl;
}

并在fraction.h中

std::ostream& operator<<(std::ostream &out, const fraction &fr); //the location of the error. 

并在类fraction.cpp文件中

ostream& operator<<(ostream& stream, const fraction& fr)
{
    if(fr.Denominator==1||fr.Numerator==0)
        stream << fr.Numerator;
    else
    stream << fr.Numerator << '/' << fr.Denominator << endl;
    return stream;
}

无论如何,错误代码很简单。 “的std :: ostream的和放; fraction :: operator&lt;&lt;(std :: ostream&amp;,const fraction&amp;)'必须只取一个参数|

我有点迷失为什么这就是它告诉我的。 [它是不是能够接受带有2个值的函数?,(std :: ostream&amp;,const fraction&amp;)只是简单的错误?它应该只是括号中的一个参数吗?]

主要功能是一成不变的,如果我的班级的cpp和头文件编码正确,则可以正常工作。

我只在朋友的功能中做过IO重载,从来没有在内部,甚至那些我没有经验的人,所以我在这一点上很丢失。

1 个答案:

答案 0 :(得分:1)

编译器告诉您正在尝试为两个参数重载operator <<,但在类运算符成员函数内部仅使用一个参数(即右侧参数) 。如果代码是friend fraction,那么你的代码就可以工作,因为你将定义一个带有两个参数的自由运算符函数。

所以要修复,要么在fraction之外定义函数,要么将其命名为类的friend。当您将其命名为friend时,该函数将能够访问该类的任何实例的私有成员。