Проблема в том, что std::endl
- это шаблон функции, так как ваш оператор <<
является. Поэтому, когда вы пишете:
my_stream << endl;
вам понравится компилятор для определения параметров шаблона для оператора
а также для endl
. Это невозможно.
Таким образом, вы должны написать дополнительные, не шаблонные, перегрузки оператора <<
в
работать с манипуляторами. Их прототип будет выглядеть так:
UIStream& operator<<(UIStream& os, std::ostream& (*pf)(std::ostream&));
(есть еще два, заменив std::ostream
на std::basic_ios<char>
и
std::ios_base
, который вы также должны предоставить, если хотите разрешить все
манипуляторы) и их реализация будет очень похожа на
ваши шаблоны. На самом деле, так похоже, что вы можете использовать свой шаблон для
реализация как это:
typedef std::ostream& (*ostream_manipulator)(std::ostream&);
UIStream& operator<<(UIStream& os, ostream_manipulator pf)
{
return operator<< <ostream_manipulator> (os, pf);
}
Последнее замечание, часто написание пользовательского streambuf
часто лучший способ
достигните того, чего пытаетесь достичь, применяя технику, которую вы используете.