Ошибка компилятора при использовании перегрузки вложенных операторов в C ++

StackOverflow https://stackoverflow.com/questions/1618551

Вопрос

У меня есть класс 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()
}

На мой взгляд, это делает код более понятным (но это опять-таки мнение, что ваши вкусы могут отличаться)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top