2013-04-22 62 views
1

我想創建一個函數,它接受<<運算符可以處理的任何操作。我有一個打破的例子。如果我更改爲void my_print(T t),它也會失敗。編譯器錯誤是cout輸入的模板

error: no matching function for call to 'my_print(<unresolved overloaded function type>)' 
note: candidate is 
note: template<class T> void my_print(const T&)

爲什麼不能編譯器解決它,當它看到的參數t正在投入cout

有沒有什麼好的方法可以解決這個問題,還是我必須手動提供附加的<<個案例如: void my_print(ostream& (*pf)(ostream&));

編輯:我知道endl是一個函數。那麼答案是函數類型不被接受爲模板?像我不能有[T = ostream& (*)(ostream&)]

+0

[性病:: ENDL的可能重複的是未知類型的時候重載運算符<<](http://stackoverflow.com/questions/1134388/stdendl-is-of-unknown-type-when-overloading-operator) – Rubens 2013-04-22 23:54:59

+1

這是因爲endl *不是*函數... – 2013-04-22 23:59:03

+0

@ KerrekSB Huh? 'ostream&operator <<(ostream&(* pf)(ostream&))'是由'cout << endl'調用的。這似乎表明'endl'是一個函數,並返回一個'ostream&'。 – Nick 2013-04-23 00:03:41

回答

0

std::endl實際上是一個函數模板。您可以閱讀完整文檔herehere。它被定義爲:

template< class CharT, class Traits > 
std::basic_ostream<charT,traits>& endl(std::basic_ostream<CharT, Traits>& os); 

編輯:你可以達到你想要使用此解決方案(我依稀從here改編)什麼

#include <iostream> 

// handles the other types 
template <typename T> 
void my_print(const T &t) { 
    std::cout << t; 
} 

// alias a few things to make the prototypes readable 
typedef std::basic_ostream<char, std::char_traits<char> > CoutType; 
typedef CoutType& (*StandardEndLine)(CoutType&); 

int main() { 
    my_print("hello\n"); // works 
    my_print(4); // works 
    my_print((StandardEndLine)std::endl); // <- NOTE: there is an explicit cast 
    return 0; 
} 
+1

這不是一個函數,這是一個模板。 – 2013-04-22 23:57:08

+0

這是一個模板功能... – Thibaut 2013-04-22 23:59:20

+0

從技術上講,它被稱爲IO操縱器。但它是「需要一個參數並返回一個值的東西......」,稱其功能並不遙遠...... – Thibaut 2013-04-23 00:00:30