我有一个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
会产生问题。我猜测<<
运算符不能像我认为的那样在两个流之间工作?
更新抱歉,我最初留下了一些代码。它固定在上面。
答案 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() ) ;