Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 获取类型为';的引用的初始化无效;标准::istream&';来自类型为'的表达式;int';_C++_Compiler Errors_Istream - Fatal编程技术网

C++ 获取类型为';的引用的初始化无效;标准::istream&';来自类型为'的表达式;int';

C++ 获取类型为';的引用的初始化无效;标准::istream&';来自类型为'的表达式;int';,c++,compiler-errors,istream,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;

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

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

第131行
返回
语句

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

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


还可以查看运算符重载。

您的代码有几处错误。首先,你 必须在
中返回
,并且只在
中返回
,作为您在
功能<代码>返回应该是列表中的最后一行
函数,并且函数中不应有其他返回。
第二,您在未验证的情况下访问分区标志
输入成功(如果
输入已失败)

粗略地说,下面这样的内容应该起作用 诀窍:

您可能需要在读取数据之前检查分隔符 除数,这样你就不会提取更多的字符了 错。(另一方面,您已经提取了完整的
int
,因此客户端很难
继续。)

相关:所以现在我得到了这个错误:警告:控件到达非void的末尾function@Goose:那么你应该看看我的第二段。如果您声明一个函数返回某个类型,那么必须确保始终可以返回该类型的内容。我重新阅读了您的段落并思考了一会儿,然后“也就是说,在函数末尾只放一个这样的return语句。”阅读之后,我找到了return语句应该放在哪里。谢谢但不知道为什么人们对这个问题投了反对票。。
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;