C++ 获取类型为';的引用的初始化无效;标准::istream&';来自类型为'的表达式;int';
我试图创建一个使用有理数的类,并对它们执行运算符重载。我在程序的一部分,输入流上有问题 我应该以“12/8”格式的输入为例,它应该将12存储到变量a中,然后将8存储到变量b中 这是我的密码: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;
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;