2012-11-24 15 views
8

演算子のオーバーロードが新しく、検索してthis helpful articleが見つかりましたが、作成者のように自分のコードを書きましたが、vector vector::operator*(float, vector) must take either zero or one argumentエラーが発生します。ここでオーバーロード*演算子 - 0または1つの引数をとる必要があります

は私のコードです:

class vector 
{ 
     public: 
     float x; 
     float y; 

     vector(float, float); 
     float operator$ (vector, vector); 
     vector operator* (float, vector); 
     vector operator* (vector, float); 
}; 

vector::vector(float _x = 0, float _y = 0) 
{ 
    x = _x; 
    y = _y;  
} 
const float vector::operator$ (const vector &v1, const vector &v2) 
{ 
    return (v1.x * v2.x) + (v1.y * v2.y); 
} 

const vector vector::operator* (const float &m, const vector &v) 
{ 
    vector ret_val = v; 
    ret_val.x *= m; 
    ret_val.y *= m; 
    return ret_val; 
} 

const vector vector::operator* (const vector &v, const float &m) 
{ 
     return m * vector;  
} 

私のオペレーティングシステムがkubuntu 12.04で、私のIDEは、ワインのWindowsプログラムローダを使用してLinux上で実行されているdev-C++です。

+3

私はベクトルのドット積を表すための良好な作業を見つけることを試みた私が今まで誰かの過負荷 '$' ..... – 0x499602D2

+0

を見たのは初めてで、何も良いが私の心に来ていません。私がやったような新しい演算子を定義できますか? –

答えて

15

メンバ関数としてoperator*()を定義しているため、暗黙のパラメータが1つあります。メソッドが呼び出されたオブジェクトです!したがって、メンバー関数は2つではなく1つの明示的なパラメーターをとります。

+0

暗黙的なパラメータに 'thisでアクセスすることができます。 ...、私は正しい? –

+0

@EBiあなたができることは間違いありませんが、本当にする必要はありません。 'this-> x'はメンバ関数の中の' x'と同じです。コンパイラは 'x'を' this-> x'に変換します。 – chrisaycock

7

オペレータオーバーロード機能をクラス外に宣言するだけです。また、あなたが望むものではないかもしれないconstを返しています。

class foo { 
    //code 
}; 

foo operator*(foo& lhs, bar& rhs) const; 
foo operator*(bar& lhs, foo& rhs) const; 
+0

オペレータオーバーロード関数をクラス外に宣言するのはなぜですか? – user2131316

+2

このリンクは理由を説明しています。それが役に立てば幸い。 http://stackoverflow.com/questions/4652932/why-define-operator-or-outside-a-class-and-how-to-do-it-properly – ajp013

関連する問題