2012-08-22 15 views
21

Sto cercando di sovraccaricare l'operatore C++ == ma im ottenendo alcuni errori ...C++ errore C2662 non può convertire puntatore 'this' da 'tipo const' per 'Tipo e'

errore C2662: 'CombatEvent: : getType': non può convertire puntatore 'this' da 'CombatEvent const' a 'CombatEvent &'

questo errore è in questa linea

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

vedere il codice sotto:

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

qualcuno può aiutarti?

risposta

49
CombatEventType getType(); 

deve essere

CombatEventType getType() const; 

il compilatore si lamenta perché la funzione viene dato un oggetto const che si sta cercando di chiamare un non const funzione. Quando una funzione ottiene un oggetto const, tutte le chiamate ad esso devono essere const in tutta la funzione (altrimenti il ​​compilatore non può essere sicuro che non sia stato modificato).

+1

Molto intelligente. Mi ci sono voluti un paio di minuti per cogliere pienamente l'idea. Grazie molto. –

6

cambiamento della dichiarazione:

CombatEventType getType() const; 

è possibile chiamare solo i membri 'const' Trough riferimenti a const.

5

È un problema const, il metodo getType non è definito come const ma gli argomenti dell'operatore sovraccarico lo sono. Poiché il metodo getType non garantisce che non cambierà i dati della classe, il compilatore genera un errore in quanto non è possibile modificare un parametro const;

Il cambiamento più semplice è quello di cambiare il metodo di getType a

CombatEventType getType() const; 

A meno che, naturalmente, il metodo è effettivamente cambiando l'oggetto.

Problemi correlati