2012-09-08 126 views
1

我正在創建一個自定義的ostream類,該類在下面的片段中簡要公開。我想能夠使用std::endl但編譯器不讓我。我不明白爲什麼。如何在自定義std :: ostream類中使用std :: endl

#include <iostream> 

struct Bar 
{ 
}; 

template <typename T> 
struct Foo 
{ 
}; 

template <typename T, typename U> 
Foo<T>& operator<<(Foo<T>& _foo, U&&) 
{ 
    return _foo; 
} 

int main() 
{ 
    Foo<Bar> f; 
    f << "aa" << std::endl; 
} 

錯誤GCC 4.7.1給我的是:

main.cpp:21:21: error: no match for ‘operator<<’ in ‘operator<< ((* & f), (*"aa")) << std::endl’ main.cpp:21:21: note: candidates are: main.cpp:13:9: note: template Foo& operator<<(Foo&, U&&) main.cpp:13:9: note: template argument deduction/substitution failed: main.cpp:21:21: note:
couldn't deduce template parameter ‘U’

爲什麼不能推斷參U?這不應該是typeof(std::endl)

+0

'typeof'是什麼? – oldrinb

+1

我們有'decltype'和'typeid'。 – chris

+0

@oldrinb java的一些操作符。我的意思是'decltype'。 – qdii

回答

4

由於std::endl

namespace std { 
template <class charT, class traits> 
basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os); 
} 

你的類不是從basic_ostream得來,所以它不能正常工作。

而且basic_ostream

basic_ostream<charT,traits>& operator<< 
(basic_ostream<charT,traits>& (*pf)(basic_ostream<charT,traits>&)) 

與像std::endl操縱的作品。

+0

好吧,但我真的可以從'basic_ostream'派生嗎?我認爲它的析構函數不是虛擬的。 – qdii

+0

@qdii爲什麼你需要自己的流類?所以,例如'std :: basic_ostringstream'是從'std :: basic_ostream'派生的。而'std :: basic_ostream'具有虛擬d-tor。 – ForEveR

2

注意,有很少需要使用模板的方法也沒有很好地利用從std::ostream獲得用於不同的目的不是與自定義std::streambuf一個std::ostream方便的初始化。要創建新的來源或目標來讀取或寫入,您從std::streambuf派生。對於您寫的流,通常會覆蓋std:;streambuf::overflow()std::streambuf::sync()

相關問題