打印Stringstream输出指针

时间:2011-06-18 23:27:01

标签: c++ pointers implicit-conversion stringstream

以下代码不是输出预期的"Bar"字符串,而是输出看起来像指针的内容。

#include <sstream>
#include <iostream>

int main()
{
    std::stringstream Foo("Bar");
    std::cout << Foo << std::endl; // Outputs "0x22fe80."
    return 0;
}

这可以通过使用Foo.str()来解决,但它在过去对我造成了一些问题。是什么导致这种奇怪的行为它在哪里记录?

3 个答案:

答案 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的地址。