Я не уверен, не будет ли этот код не компилироваться.Вывод типа шаблона для манипуляторов потока
В примере кода я работаю с:
#include <iostream>
using std::cout;
using std::endl;
class Foo {
public:
template<typename T>
Foo& operator<<(const T& t) {
cout << t;
return *this;
}
};
int main() {
Foo foo;
foo << "Hello World"; // perfectly fine
foo << endl; // shit hits the fan
return 0;
}
Это ошибка:
test.cpp:19:12: error: no match for ‘operator<<’ in ‘foo << std::endl’
test.cpp:19:12: note: candidates are:
test.cpp:10:14: note: template<class T> Foo& Foo::operator<<(const T&)
test.cpp:10:14: note: template argument deduction/substitution failed:
test.cpp:19:12: note: couldn't deduce template parameter ‘T’
Я запутался, почему он не может заменить тип функции из endl
(ostream& (*)(ostream&)
) для T
, где это четко и хорошо, когда вы указываете cout << endl;
Я нахожу это addi ционно озадачивает, что это устранит проблему [отредактированный]
Foo& operator<<(ostream& (*f)(ostream&)) {
cout << f;
return *this;
}
В случае вопрос не ясно, я спрашиваю, почему он не может вывести шаблон в первую очередь.
Что вы пытаетесь достичь? Какую-либо конкретную причину вы не получаете из 'std :: basic_ostream' или реализации streambuf? –
sehe
К последнему вопросу: он не смог вывести шаблон в первую очередь, потому что ** были применимы множественные перегрузки **, поэтому случай функции-ссылки был неоднозначным. – sehe