19

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

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

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

オーバーロードされた 'operator+' は、単項演算子または二項演算子でなければなりません (3 つのパラメーターがあります)

なにが問題ですか?

4

3 に答える 3

21

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

いずれにせよ、操作の LHS と RHS の間の対称性を確保するために、それを non-member として宣言することをお勧めします。

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

于 2012-11-25T18:58:34.110 に答える
17

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

// Member function, performs (*this + right)
Point operator+ (Point & right)

また

// Free function, performs (left + right)
Point operator+ (const Point &left, const Point& right)
于 2012-11-25T18:59:40.070 に答える
3

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

また:

  • *this代わりに使用p1してその最初のパラメーターを取り除くか、または
  • 演算子を (メンバーではなく) フリー関数にオーバーロードさせます — これが推奨されます。
于 2012-11-25T18:59:45.470 に答える