-1

我正在尝试创建一个使用有理数并对它们执行运算符重载的类。我在程序的一部分上遇到问题,即输入流。

例如,我应该以“12/8”格式输入,它应该将 12 存储到变量 a 中,然后将 8 存储到变量 b 中。

这是我的代码:

istream& operator>>( istream& In, Rational& Item )
{
    char division_sign;
    int a,b;

    In >> a >> division_sign;
    if (division_sign != '/' || !In.good())
    {
        In.setstate( ios::failbit );
    }
    else
    {
        In >> b;
        if (b != 0 || !In.good())
        {
        return Item.numerator_ = a, Item.denominator_ = b;
        }
    }
}

这是我收到的错误:

In function 'std::istream& operator>>(std::istream&, Rational&)':
131: error: invalid initialization of reference of type 'std::istream&' from expression of type 'int'

Line 131return声明

4

2 回答 2

5

您观察到的编译错误是由于您尝试返回已放入声明中的另一种类型的值。您需要返回In而不是b

return In; 

因此,您应该istream在函数执行路径的任何可能分支中返回对象引用。也就是说,只将一个这样的 return 语句放在函数的末尾。

另请查看有关运算符重载的常见问题解答。

于 2013-02-26T18:33:47.527 回答
3

您的代码有几处问题。首先,您必须 return In,并且仅In作为您在函数中做的最后一件事;return In;应该是函数的最后一行,并且函数中不应该有其他返回。其次,您在没有验证输入是否成功的情况下访问(如果输入已经失败,则division_sign不应设置)。failbit

粗略地说,像下面这样的东西应该可以解决问题:

char separator;
int nominator;
int divisor;
in >> nominator >> separator >> divisor;
if ( in && separator != '/' ) {
    in.setstate( std::ios_base::failbit );
}
if ( in ) {
    item  = Rational( nominator, divisor );
}
return in;

您可能需要在读取除数之前检查分隔符,这样如果错误就不会再提取任何字符。(另一方面,您已经提取了一个完整 int的 ,因此无论如何客户端都将很难继续。)

于 2013-02-26T19:19:48.853 回答