Перечитав ваш вопрос (в результате комментария к этому ответу ), я понял, что вам нужны не только преобразования в строку (мои предположения в другом ответе здесь ), а скорее переадресация во внутренний поток.
Теперь то, чего вы хотите достичь, непросто, и в большинстве случаев может быть излишним. В реализации [make_string][3]
, которая у меня есть (которая пересылается на внутренний ostringstream
), я не разрешаю передавать манипуляторы. Если пользователь хочет добавить новую строку (мы разрабатываем под Linux), он просто передает символ '\ n'.
Ваша проблема - переадресация манипуляторов (std::hex
, std::endl
...). Ваш оператор << определен как постоянный экземпляр типа T, но манипуляторы являются указателями на функции, и компилятор не может сопоставить его с вашими методами. </p>
Манипуляторы - это функции, которые работают с шаблоном std::basic_ostream
. Шаблон basic_ostream
и класс ostream
определены как:
template <typename TChar, typename TTraits = char_traits<TChar> >
class basic_ostream;
typedef basic_ostream<char> ostream;
// or
// typedef basic_ostream<wchar_t> if using wide characters
Тогда возможные манипуляторы, которые могут быть переданы в std :: ostream:
typedef std::ostream& (*manip1)( std::ostream& );
typedef std::basic_ios< std::ostream::char_type, std::ostream::traits_type > ios_type;
typedef ios_type& (*manip2)( ios_type& );
typedef std::ios_base& (*manip3)( std::ios_base& );
Если вы хотите принимать манипуляторы, вы должны обеспечить эту перегрузку в вашем классе:
class mystream
{
//...
public:
template <typename T>
mystream& operator<<( T datum ) {
stream << datum;
return *this
}
// overload for manipulators
mystream& operator<<( manip1 fp ) {
stream << fp;
return *this;
}
mystream& operator<<( manip2 fp ) {
stream << fp;
return *this;
}
mystream& operator<<( manip3 fp ) {
stream << fp;
return *this;
}
};
В частности, подпись для endl (которая может быть единственной, которую вам требуется):
template <typename Char, typename Traits>
std::basic_ostream<Char,Traits>&
std::endl( std::basic_ostream<Char,Traits>& stream );
, поэтому он подпадает под тип функций manip1
. Другие, такие как std::hex
подпадают под разные категории (manip3
в данном конкретном случае)