Ваши объявления функций оператора должны выглядеть следующим образом
bool operator == (const X&r) const
Помещение const в конец функции-члена обещает, что функция не изменяет ни одного члена класса (если такие члены не объявлены mutable
).Предполагается, что любая функция, не имеющая этого ключевого слова, является мутатором, и компилятор не позволяет вызывать их в экземпляре класса const.
Вы можете перегрузить функцию с одинаковыми аргументами с и без const,В этом случае версия const будет вызываться только для экземпляров класса const.Например, контейнеры STL перегружают свой оператор [], возвращая константные ссылки вместо простых ссылок.