2016-04-14 12 views
3

operator+関数integer type.Soなぜオペレータ関数から返されたオブジェクトを再利用

(obj+2)+3; //no match for 'operator+' (operand types are 'integer' and 'int') 
ような関数の呼び出しを実行できないのオブジェクトを返し、次のオペレータオーバーロードシナリオ

class integer 
{ 
    public: 
    int a; 
    integer() 
    { 
     a = 0; 
    } 
    friend integer operator+(integer &a ,int b); 
}; 
integer operator+(integer &a,int b) 
{ 
    a.a = a.a + b; 
    return a; 
} 
int main() 
{ 
    integer obj; 
    integer obj2; 
    obj+2; //Line 1. this works. 

を検討します

これが動作している間

obj2 = obj+2; 
obj2+3; 
+3

は '(OBJ + 2)は'一時的に返します。一時的なものは非const参照にバインドできません。 –

+8

一歩を踏み出すと、演算子の名前は '+'ですが、 '+ ='のようになります。これは涙で終わります。 –

+0

演算子+をconst整数&aにして参照を変更しないで、新しい整数を変更するだけで、この作業が必要になります。また、@IgorTandetnikは何を言っていたのでしょうか。 – xaxxon

答えて

3

integer &aは、aが左辺値のみを参照できることを意味します。しかしobj+2は左辺値ではありません。この問題を解決するには

、あなたはどの、integer aにあなたのパラメータを変更する必要があります。

  • は右辺値
  • に結合することができ、あなたの関数が実際にoperator+の機能を実行します。

最初のパラメータがinteger&の場合は、operator+=を書き込むことをお勧めします。その関数の場合、解はinteger&も返すので、obj+=2は左辺です。 (あなたは受け入れるべき)M.Mの答えに当然の結果として、ここでは固定コードである

2

class integer 
{ 
    public: 
    int a; 
    integer() 
    { 
     a = 0; 
    } 
    friend integer operator+(integer a ,int b); 
}; 

// fix: arg 1 passed by value 
integer operator+(integer a,int b) 
{ 
    a.a = a.a + b; 
    return a; 
} 

int main() 
{ 
    integer obj; 
    integer obj2; 
    obj+2; 
    (obj+2)+3; 
} 
関連する問題