web-dev-qa-db-ja.com

C ++エラーC2662は、「this」ポインターを「const Type」から「Type&」に変換できません

私はc ++ operator ==をオーバーロードしようとしていますが、いくつかのエラーが発生しています...

エラーC2662: 'CombatEvent :: getType': 'this'ポインターを 'const CombatEvent'から 'CombatEvent&'に変換できません

このエラーはこの行にあります

if (lhs.getType() == rhs.getType())

以下のコードを参照してください。

class CombatEvent {

public:
    CombatEvent(void);
    ~CombatEvent(void);

    enum CombatEventType {
        AttackingType,
        ...
        LowResourcesType
    };

    CombatEventType getType();
    BaseAgent* getAgent();

    friend bool operator<(const CombatEvent& lhs, const CombatEvent& rhs) {

        if (lhs.getType() == rhs.getType())
            return true;

        return false;
    }

    friend bool operator==(const CombatEvent& lhs, const CombatEvent& rhs) {

        if (lhs.getType() == rhs.getType())
            return true;

        return false;
    }

private: 
    UnitType unitType;
}

誰でも助けることができますか?

23
thiagoh
CombatEventType getType();

する必要があります

CombatEventType getType() const;

関数には、const以外の関数を呼び出そうとしているconstオブジェクトが与えられているため、コンパイラーは不平を言っています。関数がconstオブジェクトを取得する場合、その関数へのすべての呼び出しは関数全体でconstでなければなりません(そうでない場合、コンパイラは変更されていないことを確認できません)。

53
hcarver

宣言を次のように変更します。

CombatEventType getType() const;

constへの参照を介してのみ 'const'メンバーを呼び出すことができます。

6
Andrzej

これはconstの問題です。getTypeメソッドはconstとして定義されていませんが、オーバーロードされた演算子引数は定義されています。 getTypeメソッドはクラスデータを変更しないことを保証していないため、constパラメーターを変更できないため、コンパイラーはエラーをスローしています。

最も簡単な変更は、getTypeメソッドを

CombatEventType getType() const;

もちろん、メソッドが実際にオブジェクトを変更していない限り。

5
daz-fuller