2011-06-18 146 views
2

而不是输出期望的字符串"Bar",下面的代码输出看起来是指针的东西。打印字符串流输出指针

#include <sstream> 
#include <iostream> 

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

这可以通过周围使用Foo.str()来的工作,但它引起了我一些问题,在过去。什么导致这种奇怪的行为?它在哪里记录?

+1

既然这已经回答了,我不妨把这个地址的意思,以防万一你好奇。通常,为了允许流在布尔上下文中被测试,运算符void *被重载,这会导致(在一些实现中)像'operator void *()const {return(fail()?0:(void *)this)这样的代码。 }(如果没有设置失败标志)将返回对象本身的地址。在一些实现中,这意味着该类的成员或虚拟表指针的地址,至少在vC++中它似乎对后者进行操作。 – lccarrasco

回答

6

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

这并不奇怪。

流是流而不是字符串。

您可以使用成员函数.str()获取[string]缓冲区。这不是一个解决方法:它是API。它应该记录在你的C++标准库引用中,如果不是,那么你的引用是不完整/错误的。

(什么稍微奇怪的是,你得到一个内存地址,而不是编译错误,也就是说,由于在预的C++ 0x标准库使用安全布尔成语的,如覆盖在另一个答案。)

+0

嗯,它是真正的*安全布尔*成语。更像是一些残废的形式... – Xeo

+0

@Xeo:恩,不管。至少隐约相关。 :)考虑一下我的答案是非规范性的! –

+0

@Xeo:它比C++ 03中的'operator bool'更安全:) – Vitus

2

A std::stringstream不应插入到流中。这就是为什么你有str()方法。

你观察的行为是由于这样的事实,std::stringstream具有转换到void*,这是用来测试流:

if(Foo) { // this uses the conversion to void* 
} 

在C++ 11,这个转换被替换通过显式转换为bool,这将导致该代码不进行编译:

std::cout << Foo << std::endl; 
+0

为什么不编译?难道它只是输出'1'或什么的? – Maxpm

+2

不,因为转换是显式的,这意味着您必须编写'std :: cout << bool(Foo);'。检查这个其他答案的更多信息:http://stackoverflow.com/questions/6242296/conversion-function-for-error-checking-considered-good/6242355#6242355 –

0

(1)使用std ::法院< <富< <的std :: ENDL;你应该确保stringstream已经超载“< <”。

(2)如果没有过载 “< <”,使用std ::法院< <富< <的std :: ENDL;可输出Foo的地址。