Концепция operator<<( ostream &, ... )
заключается в том, что каждый класс может иметь свою собственную перегрузку, обрабатывая этот конкретный класс способом, который имеет смысл.
Это означает, что вы получаете operator<<( ostream &, const Record & )
, который обрабатывает объекты Record, и operator<<( ostream &, const std::string & )
, который обрабатывает стандартные строки, и operator<<( ostream &, const FooClass & )
, который обрабатывает объекты FooClass. Каждая из этих функций знает, как обрабатывать тип объекта, для которого она была объявлена, поскольку каждая из них требует различной обработки. (Например, getPrice()
/ getCount()
для Record
или getFoo()
/ getBar()
для FooClass
.)
Ваш шаблон попирает всю концепцию. Определив его как шаблонную функцию (которая будет соответствовать любому классу), вы не только столкнетесь со многими определениями operator<<()
, уже имеющимися в стандартной / вашей кодовой базе, но и со всеми возможными перегрузки.
Как компилятор мог решить, использовать ли operator<<( ostream &, const std::string & )
или ваш шаблон? Не может, поэтому в отчаянии вскидывает руки и сдается. Вот что говорит вам ошибка.