2011-02-09 5 views
1

フレンドオペレータのオーバーロードについて混乱します。ヘッダーファイル内にfriend演算子のオーバーロード関数を書くと問題はありませんが、関数をクラスファイルに移動すると次のエラーが表示されます。私はいくつかのサンプルを探知し、彼らはすべてヘッダファイルに関数を書いた。私は何を間違えたのですか?ありがとう。あなたが取得しているエラーメッセージからC++フレンドオペレータ+オーバーロード

...: error: expected ‘,’ or ‘...’ before ‘&’ token 
...: error: ISO C++ forbids declaration of ‘statisticain’ with no type 
...: error: ‘main_savitch_2C::statistician operator+(int)’ must have an argument of class or enumerated type 


// a.h 
class A 
{ 
    public: 
     friend A operator + (const A &a1, const A &a2); 
}; 

// a.cpp 
#include "a.h" 
A operator + (const A &a1, const A &a2) 
{ 
    // 
} 
+0

このコードは問題なく機能します。 **実際の**コードはどのように見えますか? –

+1

誰もがオペレータ+を正しくオーバーロードする方法についてアドバイスをしているので、[こちらの](http://codepad.org/8E9m5A7a)私のアドバイス。 –

答えて

3

ISO C++ forbids declaration of ‘statisticain’ with no type 

私は、あなたが「statisticain」の代わりに「統計学者を持っていることに注意してください(あなたが最後の2つの文字を反転させることにより、「統計」スペルミスだと思います。 ")

これは、ヘッダーまたは.cppファイルにoperator+が実装されているかどうかは関係ありません。

+0

ああ、私は慎重にエラーメッセージを読まなかった。どうもありがとう。 – Kyeteko

1

私は前の回答に同意します。また、私が尋ねることができる場合、引数と戻り値の型が同じクラスの場合、なぜ関数をfriendにするのですか?最初の引数がthis演算子によって暗黙的に渡されるように、なぜメンバーにしませんか?

+5

@ darkphoenix-(これはおそらく答えではなく、コメントではありません)。 'operator +'関数をメンバ関数ではなく自由関数にすると、他の型から 'A'への暗黙的な変換があると、演算子を考慮することができます。それがメンバであれば、最初のオペランドが 'A'でなかった場合、その関数は見つからないでしょう。クラスのデータメンバーにアクセスする必要がある場合、それは 'friend'になります。 – templatetypedef

0

2つのparamバージョンをクラス宣言の外に移動します。または、1つのパラメータとこのポインタを使用します。

ここでは、縮約された現実世界の例を示します。

//complexnumber.h 
    class ComplexNumber 
    { 
     float _r; 
     float _i; 

     friend ComplexNumber operator+(const ComplexNumber&, const ComplexNumber&); 

     public: 
      ComplexNumber(float real, float img):_r(real),_i(img) {} 
      ComplexNumber& operator + (const ComplexNumber &other); 
    }; 

    ComplexNumber operator+(const ComplexNumber &c1, const ComplexNumber& c2); 


//complexnumber.h 
    ComplexNumber operator+(const ComplexNumber &c1, const ComplexNumber& c2) 
    { 
     return ComplexNumber(c1._r+c2._r, c1._i+c2._i); 
    } 


    // static 
    ComplexNumber& ComplexNumber::operator + (const ComplexNumber &other) 
    { 
     this->_r = this->_r + other._r; 
     this->_i = this->_i + other._i; 

     return *this; 

    } 
+0

@ selbie- C++ ISO仕様13.5.6から: "演算子関数は**非静的な**メンバ関数か非メンバ関数でなければならず、型がクラスである少なくとも1つのパラメータを持ち、クラスへの参照、列挙、または列挙への参照。オーバーロードされた演算子を静的にすることは実際にできないように見えますが、これを調べるまではこれが当てはまるとは考えていませんでした。 – templatetypedef

+0

それを行うことができたとしても、どのような利点がありますか?メンバ関数のバージョンが間違っています。左のオペランドを変更します。 operator +はそれをしてはいけません。 –

+0

おっと、私の最初の反復は間違っていました。上記のバージョンを更新しました。 – selbie