После перечитывания вашего вопроса (в результате комментария в этом answer). Я понял, что вам нужно не только преобразование в строку (мои предположения в другом ответе здесь), а пересылка во внутренний поток.
То, чего вы хотите достичь, непросто, и в большинстве случаев может оказаться излишним. В реализации [make_string][3]
, которая у меня есть (которая пересылает внутреннюю ostringstream
), я не разрешаю передавать манипуляторы. Если пользователь хочет добавить новую строку (мы разрабатываем под Linux), он просто передает символ '\ n'.
Ваша проблема - манипуляторы пересылки (std::hex
, _4 _...). Ваш оператор ‹< определяется как принимающий постоянный экземпляр типа T, но манипуляторы являются указателями на функции, и компилятор не может сопоставить его с вашими методами.
Манипуляторы - это функции, которые работают с шаблоном 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
в данном конкретном случае)
person
David Rodríguez - dribeas
schedule
15.07.2009