2012-06-22 120 views
0

我聲明瞭全局移位運算符,但由於某種原因,編譯器無法扣除類型。扣除失敗

template<class T, size_t N> 
std::istream& operator >>(std::istream& stream, std::array<T, N>& array); 

相反,它嘗試使用std::istream&&作爲第一個參數的重載。

編輯:我經由

void myns::subns::Object::Func(std::istream& stream) { 
    stream >> array; 
} 

其中陣列是std::array<size_t, 2>調用。 事實上,當我嘗試它孤立它編譯 - 但在我的代碼的gcc(4.7)抱怨error: cannot bind ‘std::istream {aka std::basic_istream<char>}’ lvalue to ‘std::basic_istream<char>&&’

有人能向我解釋爲什麼扣不工作或我怎麼能強迫調用函數重載?

+0

你是如何調用它的? –

+0

適用於我:http://ideone.com/n2D5o – mfontanini

+0

@mfontanini謝謝。我不明白它爲什麼孤立。 – abergmeier

回答

0

如果它在名稱空間中找不到operator>>,那麼編譯器將在與您使用的參數關聯的名稱空間中查找運算符。在這種情況下,它們都來自命名空間std,而不是來自全局命名空間。因此不搜索全局名稱空間。

當你明確地呼叫::operator>>(istream, array)時,確實在看起來在全局命名空間中(正如你特意要求的那樣)。

+0

所以這裏要做的正確的事情是從'std'集合派生一個包裝類,然後編寫一個名稱空間特定的運算符? – abergmeier

+0

也許,是的。打印標準容器非常棘手,因爲它們沒有任何'operator >>'過載。讓他們成員和打印封閉類型是一個可能的解決方案。 –