оператор перегрузки c ++ == - PullRequest
0 голосов
/ 03 октября 2009

У меня есть класс со следующим

bool DistinctWord::operator==(const DistinctWord W) const
{
    return strWord == W.strWord;
}
bool DistinctWord::operator==(const DistinctWord& W) const 
{
    return strWord == W.strWord;
}

Я делаю это в моей программе

    DistinctWord* wordOne = new DistinctWord("Test");
    DistinctWord* wordTwo = new DistinctWord("Test");

    if(*wordOne == *wordTwo)
        cout << "true";
    else
        cout << "false";

Я получаю эту ошибку

ошибка C2678: бинарный '==': не найден оператор, который принимает левый операнд типа DistinctWord (или нет приемлемого преобразования) может быть встроенным оператором C ++ == (DistinctWord *, DistinctWord *

) '

Я, наверное, просто не понимаю, как правильно перегрузить.

Извините за простой вопрос. ТИА

1 Ответ

5 голосов
/ 03 октября 2009

EDIT:

ОК, я разобрался с твоей проблемой. Это нереференсная версия operator==. Это делает operator== неоднозначным. Просто удалите его (как я изначально предлагал), и он будет работать нормально.


EDIT:

В ответ на ваши изменения вы все равно должны удалить первую версию operator== Нет необходимости делать копию рассматриваемого объекта и затем сравнивать его. Второй operator== выглядит разумно и должен работать. Есть ли что-то еще, что вы пропускаете?


EDIT:

Следующие компиляции просто отлично подходят для меня с использованием g ++ 4.4.1:

#include <iostream>

struct DistinctWord {
    DistinctWord(const std::string &s) : strWord(s){}

    bool operator==(const DistinctWord& W) const {
        return strWord == W.strWord;
    }

    std::string strWord;
};


int main() {
    DistinctWord* wordOne = new DistinctWord("Test");
    DistinctWord* wordTwo = new DistinctWord("Test");

    if(*wordOne == *wordTwo)
        std::cout << "true";
    else
        std::cout << "false";
}

Если у вас все еще есть проблемы, значит, вы не показываете весь соответствующий код ...


Прежде всего, где определение для DistinctWord и как оно относится к Word?

Кроме того, вы должны сделать это:

bool Word::operator==(const Word& W) const {
     return strWord == W.strWord;
}

и просто удалите два operator==, которые у вас есть. Первый делает копию, затем сравнивает глупость, а второй сравнивает изменяемую ссылку и всегда возвращает истину, которая на самом деле не имеет смысла.

Этот должен работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...