可以使用临时的字符串流对象吗?

时间:2014-12-10 00:04:26

标签: c++ c++11

这有效:

stringstream temp;
temp << i;
result_stream << transform(temp.str());

transform是一个函数,它接受string并返回string; iint)。但是,我试图让C ++ 11创建一个没有名字的临时对象并不起作用:

result_stream << transform((stringstream() << i).str());

我认为它会起作用,因为第二个<<应该只返回第一个参数,并且我能够使用str()。但是我得到了这个错误:

error: 'class std::basic_ostream<char>' has no member named 'str'

我正在使用g ++ 4.8.1(MinGW-W64)。

有没有办法实现这一点(即使用未命名的临时代码编写这样的代码)? (上面的代码有点简化,实际代码涉及在<<以外的参数上使用int。)

4 个答案:

答案 0 :(得分:7)

临时<<上的stringstream运算符的结果是ostreamstr()上没有ostream方法。

改为使用to_string

result_stream << transform(std::to_string(i));

答案 1 :(得分:7)

这不起作用,因为第二个<<std::ostream &operator<<(std::ostream &, int);,因此返回类型为ostream&,其中没有成员str()

你必须写:

result_stream << transform( static_cast<stringstream &>(stringstream() << i).str() );

答案 2 :(得分:5)

operator<<()返回对std::ostream中包含的基类std::stringstream的引用。基类不包含str()方法。您可以将其强制转换为std::stringstream&

result_stream << transform(static_cast<std::stringstream&>(std::stringstream() << i).str()); 

答案 3 :(得分:5)

尝试并且未能为C ++ 11(2009年)做到这一点:

http://cplusplus.github.io/LWG/lwg-active.html#1203

libc ++无论如何都是非法的。

需要重新考虑,但在2017年之前不可能标准化(标准化是一个冰川过程)。