web-dev-qa-db-ja.com

オーバーロード*演算子-ゼロまたは1つの引数を取る必要があります

演算子のオーバーロードは初めてです。検索して見つけました この役立つ記事 、作成者と同じように独自のコードを記述しましたが、vector vector::operator*(float, vector) must take either zero or one argumentエラーが発生します。

これが私のコードです:

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はdev-C++ワインウィンドウプログラムローダーを使用してLinux上で実行しています。

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

16
chrisaycock

クラスの外で演算子オーバーロード関数を宣言するだけです。また、あなたはあなたが望むものではないかもしれないconstを返しています。

class foo {
  //code
};

foo operator*(foo& lhs, bar& rhs) const;
foo operator*(bar& lhs, foo& rhs) const;
7
ajp013