这有效:
stringstream temp;
temp << i;
result_stream << transform(temp.str());
(transform
是一个函数,它接受string
并返回string
; i
是int
)。但是,我试图让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
。)
答案 0 :(得分:7)
临时<<
上的stringstream
运算符的结果是ostream
。 str()
上没有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年之前不可能标准化(标准化是一个冰川过程)。