我在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();
我在这里想念什么? 谢谢!
答案 0 :(得分:4)
错误消息为error C2039: 'str': is not a member of 'std::basic_ostream<char,std::char_traits<char>>'
。它抱怨str
又名std::basic_ostream<char,std::char_traits<char>>
,而不是std::ostream
,std::ostringstream
缺失{。}}。
std::ostringstream
&#39; operator<<
仍然返回std::ostream&
(它继承了std::ostream
的这些运算符),它没有str()
成员。
Clang / libc ++(这是Xcode使用的)在其右值流插入运算符中实现了一个扩展
operator<<
相比,使rvalue流更好地匹配,std::ostream&
。这使你的代码在Xcode中编译。
要致电.str()
,您可以手动static_cast
(std::ostringstream()<<value)
返回std::ostringstream&
(使用std::ostringstream &&
或const std::ostringstream&
获取libc ++兼容性,因为它的rvalue流插入运算符返回对流的rvalue引用。
答案 1 :(得分: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)。
所以你可以使用ostream
实际将ostringstream
强制转换回static_cast<>
,因为返回的对象实际上是后一个类,如下面的代码所示:
#include<sstream>
void main(...){
(static_cast<std::ostringstream&>(std::ostringstream() << 0)).str();
}
将编译。