1

私はカスタムクラスを持っています。リンゴとしましょう。加算演算子を次のようにオーバーロードします。

apple apple::operator+(const apple & other)
{
    return apple
    (
        this->x + other.x,
        this->y + other.y,
        this->z + other.z
    );
}

そして、それはうまく機能します... 2つの const リンゴを追加してみるまで。

const apple apple1;
const apple apple2;

auto apple3 = apple1 + apple2;

「これらのオペランドに一致する演算子 "+" はありません。オペランドの種類は次のとおりです: const apple + const apple」というエラーが表示されます。

const オブジェクトを追加するためのトリックはありますか?

4

1 に答える 1

6

const加算演算子自体を次のようにマークする必要があります。

apple apple::operator+(const apple & other) const;

演算子の現在の形式は、 が変更されないことを保証しませthisん (実際には変更されませんが)。そのため、加算の LHS が である場合const apple、コンパイラはそれを使用できず、適切な演算子が利用できないと文句を言います。

通常の方法では、メンバーの代わりにフリー関数を定義してカスタム加算を実装することに注意してくださいoperator+。これは、コンパイラがコンストラクターを使用して、必要に応じて加算の LHS を に変換できるためです。メンバー関数のapple場合、これは不可能です。 operator+.

于 2013-01-26T19:56:06.727 に答える