web-dev-qa-db-ja.com

オーバーロードされた 'operator +'は、単項または二項演算子エラーである必要があります

アドバイス この回答で与えられた に従って、単純なPointクラスの+演算子を次のようにオーバーロードしました(+ =オーバーロードは正常に機能します)。

Point operator+ (Point p1, const Point& p2)
{
    return std::move(p1 += p2);
}

しかし、私は言うエラーが発生します

オーバーロードされた「operator +」は単項演算子または二項演算子である必要があります(3つのパラメーターがあります)

なにが問題ですか?

14
learnvst

演算子をメンバー関数として宣言したようです。メンバー関数は暗黙の最初のパラメーターを取ります。つまり、オペレーターは3つのパラメーターを取ります。これを非メンバー関数にすることで修正できます。

いずれの場合も、操作のLHSとRHSの間の対称性を確保するために、非メンバーとして宣言することをお勧めします。

std::move については、<utility>ヘッダーにあります。ここで使用する理由はわかりませんが。

13
juanchopanza

次のいずれかを実行します。

// Perform (*this + right)
Point operator+ (Point & right)

または

// Perform (left + right)  Friend functions have no "this".
friend Point operator+ (const Point &left, const Point& right)
14
Drew Dormann

演算子をメンバー関数にしました。つまり、暗黙の最初のthisパラメーターを含めると、実際には3つのパラメーターがあります。

どちらか:

  • 使用する *this のではなく p1そしてその最初のパラメータを取り除く、または
  • 演算子を(メンバーではなく)自由関数にオーバーロードさせます—これが推奨されます。