无效初始化类型'std :: istream&'的引用来自'int'类型的表达式

时间:2013-02-26 18:30:54

标签: c++ compiler-errors istream

我正在尝试创建一个与有理数一起工作并对它们执行运算符重载的类。我在程序的一部分输入流上有问题。

我应该以“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声明

2 个答案:

答案 0 :(得分:5)

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

return In; 

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

另请查看有关运算符重载的this FAQ

答案 1 :(得分:3)

您的代码有几个问题。首先你 必须返回In,并且只有In作为你在你身上做的最后一件事 功能; return In;应该是最后一行 函数,函数中应该有 no 其他返回值。 其次,您无需验证即可访问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,所以对客户来说非常困难 无论如何继续。)