2009-10-03 128 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 *

)'

我可能只是不理解正確的重載方式。

對不起,這個簡單的問題。 TIA

+5

什麼是Word的繼承樹? – strager 2009-10-03 18:27:01

+1

'strWord'是什麼類型?此外,它是否會爲您提供錯誤的特定行? – Twisol 2009-10-03 18:37:21

+0

@Jeremiah:看看我最新的(頂部)編輯。它有你需要的解決方案。 – 2009-10-03 19:32:47

回答

5

編輯:

OK,我已經想通了你的問題。它是operator==的非參考版本。它使得operator==含糊不清。簡單地刪除它(正如我原來的建議),它會正常工作。


編輯:

在回答您的編輯,你還是應該刪除operator==的第一個版本就沒有必要進行討論的對象的副本,然後進行比較。第二個operator==看起來合理,應該工作。你還有什麼要離開嗎?


編輯:

#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"; 
} 

如果您仍然有問題,那麼你就不能顯示所有相關代碼:

下編譯只用G ++ 4.4.1對我罰款...


首先,def是哪裏對於DistinctWord的描述以及它與Word的關係如何?

除此之外,你應該這樣做:

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

,並刪除你目前有兩個operator==的。第一個是製作一個副本,然後比較哪個是愚蠢的,第二個是比較一個可修改的引用,並且總是返回true,這並不真正起任何作用。

這一個應該工作正常。

+0

編輯顯示我現在擁有的東西。錯誤仍然存​​在 兩種方法的原因是我可以通過引用或按值傳遞。爲了測試目的,我只是在那裏放置返回true。 感謝您的幫助。 – Jeremiah 2009-10-03 19:25:25

+0

你爲什麼希望通過價值傳遞? const ref版本應該允許傳遞唯一有用的東西。 – 2009-10-03 19:27:33

+0

你爲我在一個新項目中工作,但不在我目前的項目中。我要去看看我能找到什麼。我會稍微回覆一下結果。謝謝 – Jeremiah 2009-10-03 19:56:19