Odp
перегрузки operator*
для возврата m_p
. Вы можете вызвать оператора на *this
и rhs
:
struct Ftw : public Odp<int>
{
bool operator==(const Ftw& rhs) const
{
return **this == *rhs;
}
};
Перегрузка operator*
немного необычна, однако: вместо этого она, вероятно, должна вернуть *m_p
, поскольку operator->
возвращает m_p
(это приведет к тому, что ваш класс будет иметь согласованную семантику, похожую на указатель). Если бы вы сделали это, вам пришлось бы сделать следующее для сравнения:
return &**this == &*rhs; // or explicitly as:
return &this->operator*() == &rhs.operator*();
Это становится немного грязно, и это не обязательно будет работать, если унарный &
перегружен для T
(но, на самом деле, на самом деле не должен этого делать ... ). Вы также можете получить указатель, явно вызвав operator->
, что может быть предпочтительнее:
return this->operator->() == rhs.operator->();
Реальный вопрос: «что это такое Odp
, почему вы его используете и почему вы не можете его изменить?"
На несвязанной ноте ваш operator==
должен быть либо реализован как постоянная функция-член, либо, предпочтительно, как функция друга:
bool operator==(const Ftw& rhs) const { /* ... */ }
friend bool operator==(const Ftw& lhs, const Ftw& rhs) { /* ... */ }
На другой несвязанной ноте перегрузка унарного &
почти наверняка плохая идея.