Оператор перегрузки С++ ==

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

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 *

)'

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

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


person Jeremiah    schedule 03.10.2009    source источник
comment
Что такое дерево наследования Word?   -  person strager    schedule 03.10.2009
comment
Какой тип strWord? Кроме того, он дает вам конкретную строку для ошибки?   -  person Twisol    schedule 03.10.2009
comment
@Jeremiah: см. мое последнее (вверху) редактирование. В нем есть решение, которое вам нужно.   -  person Evan Teran    schedule 03.10.2009


Ответы (1)


ИЗМЕНИТЬ:

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


ИЗМЕНИТЬ:

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


ИЗМЕНИТЬ:

Следующее прекрасно компилируется для меня с использованием 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==, которые у вас есть. Первый - это создание копии, а затем сравнение, что глупо, а ваш второй - сравнение изменяемой ссылки и всегда возвращает true, что на самом деле не служит никакой цели.

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

person Evan Teran    schedule 03.10.2009
comment
Отредактируйте, покажите, что у меня есть сейчас. Ошибка все еще существует. Причина двух методов в том, что я могу передавать по ссылке или по значению. Я просто поместил туда return true для тестирования. Спасибо за помощь. - person Jeremiah; 03.10.2009
comment
Почему вы хотите передать значение? Только полезные вещи должны быть разрешены версией const ref. - person Evan Teran; 03.10.2009
comment
Ваш у меня работает в новом проекте, но не в моем текущем. Я собираюсь пройти и посмотреть, что я могу найти. Чуть позже отпишусь о результатах. Спасибо - person Jeremiah; 03.10.2009
comment
Я вернулся и переписал свой файл main. Работает сейчас. Спасибо за быструю помощь. - person Jeremiah; 04.10.2009