2014-10-31 26 views
0

我無法理解重載類的ostream方法時收到的錯誤。在class.cpp瞭解ostream過載

ostream& operator<<(ostream& out, const dateType& d) 
{ 
    out << d.getYear() << "-" << d.getMonth() << "-" << d.getDay() 
    return out; 
} 

代碼我知道所有三個干將的工作,在我main.cpp中對其進行測試。

然而,當我運行類似:

cout << d1 << endl: 

我得到這個錯誤:

‘std::ostream& dateType::operator<<(std::ostream&, dateType&)’ must take exactly one argument 
ostream& operator<<(ostream&, dateType&); 

我寫了這樣一個ostream代碼,另一個程序工作正常。那麼,爲什麼我在這裏得到錯誤?

+0

您可能已將其聲明爲成員。它應該是非會員。 – juanchopanza 2014-10-31 11:20:34

回答

1

您將它寫爲dateType的成員函數,而成員operator<<可能只接受一個顯式參數(因爲第一個參數是隱式的,而操作符是二進制的)。目前,您有三種參數operator<<,採取暗示dateType,然後std::ostream&,然後另一個dateType

這裏是如何的成員operator<<看起來:

struct T 
{ 
    operator<<(ostream&); 
}; 

這樣做的問題是,現在你有一個operator<<,關於需要T留下和右邊的流,這是反慣例。 T() << std::cout是不正確的,是嗎?

然後,我們使用命名空間範圍爲我們的operator<<重載,我們可以完全控制參數順序。

也就是說,不會使其成爲dateType的成員函數。
如果這些獲得者是private,您可能需要將此新功能設爲frienddateType


I wrote an ostream code like this for another program that works fine.

沒有你/沒有。

+0

謝謝。我沒有意識到我的.h文件中的類聲明中有我的ostream代碼。我把它和我的istream聲明都移到類定義之外,而不是唯一剩下的錯誤是: 'std :: istream&dateType :: operator >>(std :: istream&,dateType&)'必須只有一個參數 istream& dateType :: operator >>(istream&in,dateType&d) 我正確地認爲這是相同類型的問題嗎? – Blackwell 2014-10-31 11:35:04

+0

@Blackwell:是的。你的'operator >>'仍然是一個成員。 – 2014-10-31 11:36:14

+0

是的,在我發佈之後就明白了。非常感謝。 – Blackwell 2014-10-31 11:39:53