Ошибка компилятора при использовании перегрузки вложенных операторов в C ++
-
06-07-2019 - |
Вопрос
У меня есть класс URL, который перегружает операторы ==, < ;, > и! = для простого сравнения. Класс URL имеет строковый элемент данных и некоторые функции для работы со строкой. Операторы работают нормально при тестировании с классом URL.
У меня также есть класс Page, содержащий элемент данных URL. Я пытаюсь перегрузить те же операторы в классе Page. Равенство в классе Page основано на равенстве их соответствующих URL, поэтому я использую логические операторы класса URL при сравнении страниц. Это создает некоторые ошибки компилятора, которые я не могу понять. Код для операторов URL:
bool URL::operator ==(URL & u) const {
//url is the string instance variable
return url == u.GetURL();
}
Код для операторов страницы:
bool Page::operator ==(Page & p) const {
//url is the URL instance variable of the Page class
return url == p.GetURL();
}
Это приводит к таким ошибкам:
src/Page.cpp: In member function ‘bool Page::operator==(Page&) const’:
src/Page.cpp:21: error: no match for ‘operator==’ in ‘((const Page*)this)->Page::url == Page::GetURL()()’
inc/URL.h:118: note: candidates are: bool URL::operator==(URL&) const
Я предсказываю, что это что-то глупое, что я забыл. Вы докажете, что я прав?
edit: Const-корректность укусила меня в задницу. Спасибо за помощь.
Решение
Это должно было быть:
bool URL::operator ==(const URL & u) const {
//url is the string instance variable
return url == u.GetURL();
}
И аналогично для других операторов.
Если вы все еще получаете ошибки компилятора, возможно, вы также не сделали GetURL()
const:
std:string URL::GetURL() const {
// whatever...
}
Другие советы
Я также хотел бы отметить, что существуют методы (то есть открытый интерфейс) для защиты внешних объектов от изменений в деталях реализации. Кроме того, класс автоматически становится его другом (по той же причине) и, таким образом, просто получает доступ к членам другого объекта.
bool URL::operator ==(URL & u) const {
//url is the string instance variable
return url == u.GetURL();
}
Может быть написано так:
bool URL::operator ==(URL & rhs) const
{
return url == rhs.url; // No need to use GetURL()
}
На мой взгляд, это делает код более понятным (но это опять-таки мнение, что ваши вкусы могут отличаться)