2014-10-11 82 views
0

假設我們有一個istream子用下面的方法:如果有關於流的「超載衝突」會發生什麼?

SomeStream& operator>>(Something& something) { 
    // .. write data into something 
} 

而且我們也有以下全局方法:

Something& operator>>(istream& stream, Something& something) { 
    // .. write data from stream into something 
} 

如何C++知道調用以下代碼方法:

instanceOfSomeStream >> instanceOfSomething; 

跟進的問題: SomeStream寫入Something的更好或更常見的方法是什麼?我應該在SomeStream中添加另一個過載operator>>,這需要Something&參數嗎?或者我應該以相反的方式,並在Something中創建一個過載,需要SomeStream? (實際上不是在Something,而是因爲顯而易見的原因作爲全局函數)。

+0

正常情況下,當你使用'std :: istream'或者'std :: ostream'時,就是爲了包裝自定義的'std :: streambuf'。如果您需要爲某個類型提供I/O功能,可以像第二個代碼塊中那樣通過重載全局的'operator >>()'/'operator <<()來完成。任何自定義的行爲'SomeStream'可能會展示應該與它可能使用的緩衝區相關,否則不值得創建另一個流類型。 – 0x499602D2 2014-10-11 01:56:09

回答

1

C++通常具有複雜的重載解析規則。在這種情況下,知道成員函數用於重載解析的目的非常有用,就像非成員函數一樣,它引用類作爲隱含的第一個參數,即,即,選擇之間的東西是[ 1]

SomeStream& operator>>(SomeStream& somestream, Something& something) 

Something& operator>>(istream& stream, Something& something) 

過程返回類型並不重要,而對於

instanceOfSomeStream >> instanceOfSomething 

將選擇第一個過載,因爲SomeStreamistream派生得更多。

您的後續問題應該是一個單獨的問題。這裏有一些可能相關的討論:Should operator<< be implemented as a friend or as a member function?

[1]注:我說「類似」,因爲這不完全正確。例如,可以在右值對象表達式上調用這樣的成員函數,即使上面顯示了左值引用。

+0

隱式參數與您可能會聲明的引用之間存在許多差異。而且,關聯問題的答案強調它必須是一個自由功能。除了'ifstream'的istringstream之外,'istream'不應該被子類化,即支持'streambuf'子類。 – Potatoswatter 2014-10-11 03:14:39

相關問題