-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 ステートメントを 1 つだけ関数の最後に配置します。

演算子のオーバーロードに関するこの FAQ もご覧ください

于 2013-02-26T18:33:47.527 に答える
3

コードにはいくつか問題があります。まず、 を返す必要があり、関数で行う最後のこととしてInのみ。は関数の最後の行である必要があり、関数内に他のリターンがあってはなりません。次に、入力が成功したことを確認せずにアクセスします (入力が既に失敗している場合は を設定しないでください)。Inreturn In;division_signfailbit

大まかに言えば、次のような方法でうまくいくはずです。

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 に答える