2013-02-05 17 views
1

可能重複:
std::endl is of unknown type when overloading operator<<爲什麼我自己的輸出流類不工作?

#include <iostream> 

using namespace std; 

struct OutputStream 
{ 
    template<class T> 
    OutputStream& operator <<(const T& obj) 
    { 
     cout << obj; 

     return *this; 
    } 
}; 

OutputStream os; 

int main() 
{  
    os << 3.14159 << endl; // Compilation Failure! 
} 

的VC++ 2012編譯器抱怨:

錯誤C2676:二進制 '< <': '的OutputStream' 不限定此運算符或轉換爲可接受的類型到預先規定的操作

+0

你沒有定義ENDL –

+0

不牛逼不適用於ENDL? – xmllmx

+0

我認爲它會適用,但代碼沒有endl編譯。 我只是等待更聰明的人回答。 :p –

回答

4

的原因是,編譯器不能推斷的T類型,因爲std::endl是通過提供適當的定義爲

template <class charT, class traits> 
    basic_ostream<charT,traits>& endl (basic_ostream<charT,traits>& os); 

它是在輸入輸出流克服的方式是一個函數模板的operator<<超載:

OutputStream& operator <<(std::ostream& (*pf)(std::ostream&)) 
{ 
    cout << pf; 
    return *this; 
} 
+0

很好的答案!簡潔通用! – xmllmx

+0

@xmllmx:謝謝 – vitaut