麻烦wstringstream

时间:2010-06-09 22:34:55

标签: c++ string

我有一个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 个答案:

答案 0 :(得分:3)

看起来编译器选择接受operator<<参数的void*版本并以十六进制格式打印其64位地址。 operator<<的文本打印版本是一个模板,它采用与流的表示形式相同的字符,在您的情况下为wchar_t。你已经传递了一个char的数组;使用宽字符文字,而Swegi's answer建议:

outStream << L"odp";

答案 1 :(得分:3)

从流到流复制没有过载。 您需要更改该行:

bar_stream << sstream;

为:

bar_stream << sstream.str();

答案 2 :(得分:1)

您是否尝试过L"odp"

答案 3 :(得分:0)

好的,通过您的更新,您发现了问题:

bar_stream&lt;&lt; sstream;

wstringstream是:

typedef basic_stringstream<wchar_t> wstringstream;

basic_stringstream是一个basic_iostream,它是一个basic_ostream(和一个basic_istream,但我们不关心那个部分),它是一个basic_ios,它是一个ios_base。

但是没有basic_ostream& operator<<(basic_ostream&);;我不确定编译器使用了哪个重载,但它从输出中看起来是basic_stringstream&amp; basic_stringstream :: operator&lt;&lt;(void * p),以十六进制输出指针的值。

如果要复制sstream的数据,请使用带有const basic_string的wstringstream ctor。传递原始wstringstream的内部字符串的副本:

wstringstream bar_stream( sstream.str() ) ;