web-dev-qa-db-fra.com

L'erreur c ++ C2662 ne peut pas convertir le pointeur 'this' de 'const Type' en 'Type &'

J'essaie de surcharger l'opérateur c ++ == mais je reçois des erreurs ...

erreur C2662: 'CombatEvent :: getType': ne peut pas convertir 'ce' pointeur de 'const CombatEvent' en 'CombatEvent &'

cette erreur est sur cette ligne

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

voir le code ci-dessous:

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;
}

quelqu'un peut-il aider?

23
thiagoh
CombatEventType getType();

doit être

CombatEventType getType() const;

Votre compilateur se plaint car la fonction reçoit un objet const sur lequel vous essayez d'appeler une fonction non - const. Lorsqu'une fonction obtient un objet const, tous les appels à celle-ci doivent être const dans toute la fonction (sinon le compilateur ne peut pas être sûr qu'il n'a pas été modifié).

55
hcarver

changer la déclaration en:

CombatEventType getType() const;

vous pouvez uniquement appeler les membres 'const' par le biais de références à const.

7
Andrzej

C'est un problème de const, votre méthode getType n'est pas définie comme const mais vos arguments d'opérateur surchargés le sont. Étant donné que la méthode getType ne garantit pas qu'elle ne modifiera pas les données de classe, le compilateur génère une erreur car vous ne pouvez pas modifier un paramètre const;

La modification la plus simple consiste à remplacer la méthode getType par

CombatEventType getType() const;

À moins bien sûr que la méthode ne modifie réellement l'objet.

5
daz-fuller