Visual Studio: "str() is not a member of std::ostringstream"

Visual Studio: "str() is not a member of 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(); 

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

错误信息是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::ostringstream

std::ostringstreamoperator<<仍然是returnsstd::ostream&(它从std::ostream继承了这些运算符),它没有str()成员.

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

  1. 与继承的成员 operator<<s 和
  2. 相比,它更适合右值流
  3. returns 对流的引用,无需转换为 std::ostream&.

这使您的代码在 Xcode 中编译。

要调用 .str(),您可以手动 static_cast (std::ostringstream()<<value) 返回 std::ostringstream&(使用 std::ostringstream &&const std::ostringstream& 以获得 libc++ 兼容性,因为它的右值流插入运算符 returns 是对流的右值引用)。

从我的编译器来看,它实际上是 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,因为返回的对象实际上是后者 class,如以下代码:

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

将编译。