Оператор равенства, который поддерживает сравнение двух ссылок на объекты? - PullRequest
0 голосов
/ 25 апреля 2018

Это уже существующий код, который отлично работает.

bool operator==(CMyClass X) {return m_Data==X.m_Data;}

if(a == b){...} //a and b are both CMyClass objects

Но теперь у меня есть код:

if(x.get() == y.get()){...} // get() returns CMyClass&

Я уже изменил его, чтобы получить константную ссылку

bool operator==(const CMyClass &X) {return m_Data==X.m_Data;}

И я все еще получаю ошибку компиляции:

ошибка C2678: бинарный '==': не найден оператор, который принимает левый операнд типа 'const CMyClass' (или тамнедопустимое преобразование)

Нужна ли мне простая поправка к существующему оператору или добавить новую версию с двумя аргументами?Должны ли операторы равенства не принимать параметры const ref как лучшую практику?

1 Ответ

0 голосов
/ 25 апреля 2018

Оператор равенства должен принимать свой параметр по константной ссылке (поскольку он не будет вносить никаких изменений в значение), а также быть константной функцией (если он является членом класса).

Итакваше объявление должно быть

bool operator==(const CMyClass &X) const {return m_Data==X.m_Data;}

Поскольку ваша функция get возвращает const CMyClass &, исходное сравнение на равенство не вызывается, поскольку оно не является функцией const и не может быть вызвано для объекта const.

...