Проблема с wstringstream - PullRequest
2 голосов
/ 10 июня 2010

У меня есть wstringstream:

wstringstream sstream;
AlterSstream(sstream);

wstringstream bar_stream;

bar_stream << sstream;
bar_stream << "foo";

MessageBoxW(
  NULL,
  bar_stream.str().c_str(),
  L"subject",
  MB_OK
);

Это выводит длинную строку, которая не выглядит так, как я положил в нее AlterSstream():

00000000002CEC58foo

AlterSstream:

void AlterSstream(wstringstream& outStream)
{
    outStream << "odp";
}

Почему это происходит?Если я распечатаю sstream напрямую, он работает нормально, но распечатка bar_stream создает проблему.Я предполагаю, что оператор << не работает так, как я думаю, он работает между двумя потоками?

ОБНОВЛЕНИЕ: Извините, первоначально я оставил немного кода.Это исправлено выше.

Ответы [ 4 ]

3 голосов
/ 10 июня 2010

Похоже, что компилятор выбрал версию operator<<, которая принимает аргумент void* и печатает его 64-битный адрес в шестнадцатеричном формате. Версия для печати текста operator<< - это шаблон, который принимает тот же тип символов, что и представление потока, в вашем случае это wchar_t. Вы передали ему массив char; вместо этого используйте широкий символьный литерал, поскольку ответ Swegi предполагает:

outStream << L"odp";
3 голосов
/ 10 июня 2010

Нет перегрузки для копирования из потока в поток. Вам нужно изменить строку:

bar_stream << sstream;

до:

bar_stream << sstream.str();
1 голос
/ 10 июня 2010

Вы пробовали L"odp"?

0 голосов
/ 10 июня 2010

Хорошо, с вашим обновлением вы обнаружили проблему:

bar_stream << sstream; </p>

wstringstream - это:

typedef basic_stringstream<wchar_t> wstringstream;

basic_stringstream is - basic_iostream, который является - basic_ostream (и basic_istream, но нас не волнует эта часть), который является basic_ios, который является ios_base.

Но нет basic_ostream& operator<<(basic_ostream&);; Я не уверен, какую перегрузку использует компилятор, но из вывода он выглядит как basic_stringstream & basic_stringstream :: operator

Если вы хотите скопировать данные потока, используйте cst wstringstream, который принимает const basic_string. передав ему копию оригинальной внутренней строки wstringstream:

wstringstream bar_stream( sstream.str() ) ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...