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

时间:2015-04-20 09:55:38

标签: c++ visual-studio stl std ostringstream

我在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(); 

我在这里想念什么? 谢谢!

2 个答案:

答案 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::ostreamstd::ostringstream缺失{。}}。

std::ostringstream&#39; operator<<仍然返回std::ostream&(它继承了std::ostream的这些运算符),它没有str()成员。

Clang / libc ++(这是Xcode使用的)在其右值流插入运算符中实现了一个扩展

  1. 与继承的成员operator<<相比,使rvalue流更好地匹配,
  2. 按原样返回对流的引用,而不转换为std::ostream&
  3. 这使你的代码在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();
}

将编译。