1. ホーム
  2. c++

[解決済み] エラー C2804: バイナリ '演算子 +' のパラメータが多すぎる (VC 120 でコンパイル)

2022-02-11 14:44:22

質問

自作のベクタークラス(ゲームエンジン用)を作成し、Visual Studio 2013 CPlusPlusプロジェクトで「+」演算子をオーバーロードすると(VCランタイム120を使用)、コンパイラーエラーが発生します。

エラー: この演算子関数のパラメータが多すぎます。

のコードスニペットです。 Vector.hpp ファイルを以下に示します。

ベクター.hpp

class Vector
{
private:
    double i;
    double j;
    double k;
public:
    Vector(double _i, double _j, double _k)
    {
        i = _i;
        j = _j;
        k = _k;
    }

    Vector& operator+=(const Vector& p1)
    {
        i += p1.i;
        j += p1.j;
        k += p1.k;
        return *this;
    }

    //Some other functionality...

    Vector operator+(const Vector& p1, Vector& p2) //Error is thrown here...
    {
        Vector temp(p1);
        return temp += p2;
    }
};

私はここで何を間違えているのでしょうか?私の演算子は非メンバー関数をオーバーロードさせたくありません。

どうすればいいですか?

いつ operator+ がクラス内部で定義されている場合、演算子の左オペランドは現在のインスタンスになります。従って、この演算子のオーバーロードを宣言するには operator+ 2つの選択肢があります。

  • クラス内部で、右オペランドであるパラメータを1つだけ指定します。
  • クラスの外側で、左と右の2つのオペランドを持つ。

選択肢1:クラス外

class Vector
{
private:
    double i;
    double j;
    double k;
public:
    Vector(double _i, double _j, double _k)
    {
        i = _i;
        j = _j;
        k = _k;
    }

    Vector& operator+=(const Vector& p1)
    {
        i += p1.i;
        j += p1.j;
        k += p1.k;
        return *this;
    }

    //Some other functionality...


};

Vector operator+(const Vector& p1, const Vector& p2)
{
    Vector temp(p1);
    temp += p2;
    return temp;
}

選択肢2:クラス内

class Vector
{
private:
    double i;
    double j;
    double k;
public:
    Vector(double _i, double _j, double _k)
    {
        i = _i;
        j = _j;
        k = _k;
    }

    Vector& operator+=(const Vector& p1)
    {
        i += p1.i;
        j += p1.j;
        k += p1.k;
        return *this;
    }



    Vector operator+(const Vector & p2)
    {
        Vector temp(*this);
        temp += p2;
        return temp;
    }

};

演算子をどのように宣言するかは、こちらで確認できます。 C/C++演算子