2009-10-03 5 views
0

У меня есть класс со следующимC++ перегрузка оператора ==

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 *

)

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

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

+5

Что такое дерево наследования 'Word'? – strager

+1

Какой тип 'strWord'? Кроме того, дает ли она вам определенную строку для ошибки? – Twisol

+0

@Jeremiah: см. Мою последнюю (вверху) править. У этого есть необходимое решение. –

ответ

5

EDIT:

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


EDIT:

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


EDIT:

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

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

+0

Редактировать показать, что у меня есть сейчас.Ошибка все еще существует Причина для двух методов заключается в том, что я могу передавать по ссылке или по значению. Я просто положил туда верный вариант для тестирования. Спасибо за помощь. – Jeremiah

+0

Почему вы хотите перейти по цене? Единственная полезная вещь, которую нужно пройти, должна быть разрешена версией const ref. –

+0

Твоя работа для меня в новом проекте, но не в моем текущем. Я собираюсь пойти и посмотреть, что я могу найти. Я верну немного назад результаты. Спасибо – Jeremiah