Я хочу создать функцию, которая принимает все, что может обработать оператор <<
для std::cout
. У меня есть пример, который ломается.Шаблоны для ввода cout
#include <iostream>
template <typename T>
void my_print(const T &t) {
std::cout << t;
}
int main() {
my_print("hello\n"); // works
my_print(4); // works
my_print(std::endl); // compiler error
return 0;
}
Он также терпит неудачу, если я изменяю void my_print(T t)
. Ошибка компилятора
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&));
EDIT: Я знаю endl
является функцией. Является ли ответ тем, что типы функций не принимаются в качестве шаблонов? Как у меня не может быть [T = ostream& (*)(ostream&)]
?
возможно дубликат [станд :: End L, имеет неизвестную типа, когда оператор перегрузки <<] (http://stackoverflow.com/questions/1134388/stdendl-is-of-unknown-type-when-overloading-operator) – Rubens
Это потому, что endl * не является * функцией ... –
@ KerrekSB А? 'ostream & operator << (ostream & (* pf) (ostream &))' - это то, что вызывается 'cout << endl'. Это, по-видимому, указывает на то, что 'endl' - это функция, принимающая и возвращающая' ostream & '. – Nick