2013-05-31 197 views
-2

我已經定義了一個Player類來完成一些操作,所以我很方便重載一些基本的操作符。具體來說,我想用<來比較Player對象。因此,我在課堂上有以下幾種:爲cout重載'<'Operator Breaks <<?

bool operator<(const Player& rhs) const {return (*this < rhs);} 

不幸的是,這導致了問題。後來,當我嘗試在我的主函數中輸出包含特定元素的矢量時,編譯器讓我知道操作數不匹配,並且它期望std :: ostream < < Player。下面是導致此問題的行:

vector<Player> playerVec(6); 

for (int i = 0; i < 6; i++) { 

cout << playerVec[i]; 

} 

注意,我真的不希望輸出的任何播放器直接反對流,所以我不認爲我需要重載< <。

我對發生了什麼有一些想法,因爲編譯器需要我的具體定義<,然後不打擾尋找更一般的情況。我的問題是,我現在是否需要重載運算符以返回其通用功能,還是有更簡單的解決方案?

感謝您提供的任何幫助!

+1

請給我們的代碼。 – 0x499602D2

+6

這不是無限遞歸嗎? – juanchopanza

+2

如果你想輸出你的對象,你應該重載<<運算符,它不依賴於運算符<過載 –

回答

7

我猜測你是在處理兩個不同的問題:

1)你缺少std::ostream& operator<<(std::ostream&, const Player&),這是你爲了流Player對象std::cout等輸出需要流

2)您的Player小於比較運算符<中有一個無限遞歸,因爲您提供的運算符自己調用。

+0

1)我不想輸出播放器對象流,但是,所以我沒有超載<<。我只想輸出一個矢量。我編輯了原文,以顯示特定的電話。 2)請詳細說明。我想我明白你的觀點,但是在這種情況下,我會如何比較玩家對象和當前對象呢?我認爲rhs參數就足夠了,但現在我看到了這個問題。 –

+0

@Rome_Leader 1)輸出矢量是什麼意思?你的代碼從字面上說是流播放器對象。 2)你比較Player對象的成員,但你認爲合適。例如:'return id == rhs.id;' –

+0

@Rome_Leader:爲了輸出'Player'的容器(矢量),你必須能夠輸出一個單獨的'Player'。輸出「Player」的矢量時,你期待什麼? –

1

我不認爲,你的operator<()是干擾。根據代碼的複雜程度,您可以通過簡單地評論它來驗證這一點,並檢查是否得到相同的錯誤。

您需要指定std::ostream & operator<<(std::ostream & os, const Player & p)非成員函數,否則編譯器不知道該如何編寫類似os << myPlayer的文件。