3

以下に示す私のコードの何が問題になっていますか?誰かが光を投げてください。御時間ありがとうございます !

    #include<iostream.h>
      using namespace std;

     struct mydata{
        int mx;
        mydata(int x = 0){}
        mydata operator+(const mydata& rhs){

                mydata temp(rhs);
                return temp;
        }
        operator int() const{ return mx; }
        operator double() const{ return mx; }
};


int main(){
        mydata d;
        mydata r = d + 5; // L1
        5 + d; // L2
        d + d; // L3
}
4

4 に答える 4

3

まず、問題が何であるかを述べていませんが、おそらく2つのオブジェクトの値operator+を合計するものが必要です。mxmydata

mydata operator+(const mydata& rhs){
        return mydata (mx + rhs.mx);
}

次に、これを非メンバー関数にして、LHSとRHSが同じように扱われるようにし、次の問題を修正することをお勧めしますL2

mydata operator+(const mydata& lhs, const mydata& rhs){
        return mydata (lhs.mx + rhs.mx);
}

operator+(int,int)最後に、コンパイラは組み込みを使用するか独自のを使用するかを決定できないため、あいまいなオーバーロードが残りますoperator+(const mydata&, const mydata&)int()これは、キャスト演算子とを削除することで修正できますdouble()

こちらのデモをご覧ください。

于 2012-12-18T06:39:26.170 に答える
2

問題(コメントで述べられている)は、コンパイラが+実行したいものを認識していないことです。

(double)d + 5

また

(int)d + 5

このあいまいさを解決するには、型変換を指定するか、これらの演算子の1つを名前付き関数に置き換える必要があります。

    operator int() const{ return mx; }
    operator double() const{ return mx; }

代わりにd+mydata(5)を使用する場合は、上記のバリアントが適用される可能性が高いため、そのように記述する必要があります。

于 2012-12-18T06:48:35.630 に答える
1

operator+異なるデータ型で有効にするために、いくつかの非メンバー演算子+を提供できます。

mydata operator+(const mydata& lhs, const mydata& rhs){
        return mydata (lhs.mx + rhs.mx);
}
mydata operator+(int mx, const mydata& rhs){
        return mydata (rhs.mx+mx);
}

mydata operator+(const mydata& lhs, int mx){
        return mydata(lhs.mx+mx);
}
于 2012-12-18T06:53:20.607 に答える
0

5+dはできません。5はこのようなクラスオブジェクトに変換できません。このためには、クラスメソッドから演算子+定義を取得する必要があります。(私の知る限り、できれば友達)。

于 2012-12-18T06:45:08.343 に答える