以下代码不是输出预期的"Bar"
字符串,而是输出看起来像指针的内容。
#include <sstream>
#include <iostream>
int main()
{
std::stringstream Foo("Bar");
std::cout << Foo << std::endl; // Outputs "0x22fe80."
return 0;
}
这可以通过使用Foo.str()
来解决,但它在过去对我造成了一些问题。是什么导致这种奇怪的行为它在哪里记录?
答案 0 :(得分:6)
这可以通过使用Foo.str()解决,但它在过去给我带来了一些问题。是什么导致这种奇怪的行为它在哪里记录?
这一点都不奇怪。
流是流,而不是字符串。
您可以使用成员函数.str()
获取[string]缓冲区。这不是一种解决方法:它是API。它应该记录在您的C ++标准库引用中,如果不是,那么您的引用是不完整/错误的。
( 有点奇怪的是你得到的是内存地址而不是编译错误;这是因为在预先使用了安全bool习语 C ++ 0x标准库,如另一个答案所述。)
答案 1 :(得分:2)
不应在流中插入std::stringstream
。这就是你使用str()
方法的原因。
您正在观察的行为是由于std::stringstream
转换为void*
,这是用于测试流的内容:
if(Foo) { // this uses the conversion to void*
}
在C ++ 11中,此转换被显式转换为bool取代,导致此代码无法编译:
std::cout << Foo << std::endl;
答案 2 :(得分:0)
(1)使用std :: cout&lt;&lt; Foo&lt;&lt;的std :: ENDL;你应该确保stringstream已经超载“&lt;&lt;”。
(2)如果没有超载“&lt;&lt;” ,使用std :: cout&lt;&lt; Foo&lt;&lt;的std :: ENDL;可以输出Foo的地址。