Visual Studio: "str()不是std :: ostringstream的成员"

4
我在使用Visual Studio 2013编译时遇到了错误(而Xcode 6.2可以编译),但我无法理解错误的含义:
以下示例代码是格式转换的摘要:
#include<sstream>
void main(...){
    (std::ostringstream()<<0).str();
}

在遵循以下版本编译时:

#include<sstream>
void main(...){
    (std::ostringstream()).str();
}

背景:

std::string result=(std::ostringstream()<<value).str(); 

我在这里错过了什么?谢谢!

(注:无需修改html标签)

谢谢您的建议,确实,该帖子在这方面并不清楚,但是是的,在 <sstream> 之前已经包含了 <string>。 - raketa
2个回答

5
错误信息为error C2039: 'str': is not a member of 'std::basic_ostream<char,std::char_traits<char>>'。它在抱怨std::basic_ostream<char,std::char_traits<char>>,也称为std::ostream,缺少str成员,而不是std::ostringstreamstd::ostringstreamoperator<<仍然返回std::ostream&(它从std::ostream继承这些运算符),后者没有str()成员。
Clang/libc++(Xcode使用的库)在它的右值流插入运算符中实现了一个扩展,其目的是
  1. 相对于继承的成员operator<<,使其更适合右值流。
  2. 直接返回对流的引用,而不进行转换为std::ostream&
这两个特性共同使您的代码在Xcode中编译通过。
要调用.str(),您可以手动将(std::ostringstream()<<value)强制转换回std::ostringstream&(使用std::ostringstream &&const std::ostringstream&,以获得对libc++兼容性的支持,因为它的右值流插入运算符返回对流的右值引用)。

谢谢大家,这个方法可行!多么快速的解决方案啊! 错误信息是我看错了,都是我的错:应该是“str()不是std::ostream的成员” 感谢你们指出问题并提供转换的解决方案! - raketa
为了使用clang编译,需要一个const: static_cast<const std::ostringstream&>(std::ostringstream()<<value).str() - raketa

0

从我的编译器来看,它实际上显示了sst.cpp(3) : error C2039: “str”: is not a member of “std::basic_ostream<char,std::char_trait s<char>>”。请注意,这是关于ostream而不是ostringstream的问题。 <<是为ostream定义的运算符(std::ostream::operator<<,您可以参考this)。

因此,您实际上可以使用static_cast<>ostream转换回ostringstream,因为返回的对象实际上属于后者类,就像以下代码:

#include<sstream>
void main(...){
    (static_cast<std::ostringstream&>(std::ostringstream() << 0)).str();
}

将会编译。


不,它无法编译。 - T.C.
嘿,VS2013比我想象的还要糟糕。强制转换应该是到std::ostringstream&。尽管如此,它似乎并没有正常工作(检查str()返回的内容)。 - T.C.
@T.C. 使用 std::ostream const& 应该没有问题。 - Konrad Rudolph
@KonradRudolph 请问,您是指 ostream 还是 ostringstream - T.C.
@T.C. 哎呀,后者。 - Konrad Rudolph
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接