thiagoh
thiagoh

Reputation: 7388

c++ error C2662 cannot convert 'this' pointer from 'const Type' to 'Type &'

I am trying to overload the c++ operator== but im getting some errors...

error C2662: 'CombatEvent::getType' : cannot convert 'this' pointer from 'const CombatEvent' to 'CombatEvent &'

this error is at this line

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

see the code bellow:

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

can anybody help?

Upvotes: 33

Views: 52037

Answers (4)

Robert Russell
Robert Russell

Reputation: 305

I've seen this error with code like

    get_color(const std::unsigned_integral auto &x,
              const std::unsigned_integral auto &y,
              const BPPT &                       depth,
              const std::unsigned_integral auto &palette    = 0U,
              const std::unsigned_integral auto &texture_id = 0U) const

When I changed to a template it worked.

  template<std::unsigned_integral xT,
           std::unsigned_integral yT,
           std::unsigned_integral paletteT,
           std::unsigned_integral texture_idT>
  [[nodiscard]] Color16
    get_color(const xT          x,
              const yT          y,
              const BPPT        depth,
              const paletteT    palette    = 0U,
              const texture_idT texture_id = 0U) const

Upvotes: 0

hcarver
hcarver

Reputation: 7214

CombatEventType getType();

needs to be

CombatEventType getType() const;

Your compiler is complaining because the function is being given a const object that you're trying to call a non-const function on. When a function gets a const object, all calls to it have to be const throughout the function (otherwise the compiler can't be sure that it hasn't been modified).

Upvotes: 70

daz-fuller
daz-fuller

Reputation: 1231

It's a const issue, your getType method is not defined as const but your overloaded operator arguments are. Because the getType method is not guaranteeing that it will not change the class data the compiler is throwing an error as you can't change a const parameter;

The simplest change is to change the getType method to

CombatEventType getType() const;

Unless of course the method is actually changing the object.

Upvotes: 5

Andrzej
Andrzej

Reputation: 5127

change the declaration to :

CombatEventType getType() const;

you can only call 'const' members trough references to const.

Upvotes: 9

Related Questions