【问题标题】:Visual Studio: "str() is not a member of std::ostringstream"Visual Studio:“str() 不是 std::ostringstream 的成员”
【发布时间】:2015-04-20 09:55:38
【问题描述】:

我无法理解 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(); 

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

【问题讨论】:

  • 感谢您的建议,是的,帖子对此并不清楚,但是,是的, 已包含在 之前。

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


【解决方案1】:

错误消息是error C2039: 'str': is not a member of 'std::basic_ostream&lt;char,std::char_traits&lt;char&gt;&gt;'。它抱怨str 缺少std::basic_ostream&lt;char,std::char_traits&lt;char&gt;&gt; aka std::ostream,而不是std::ostringstream

std::ostringstreamoperator&lt;&lt; 仍然返回std::ostream&amp;(它从std::ostream 继承这些运算符),它没有str() 成员。

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

  1. 与继承的成员 operator&lt;&lt;s 相比,使其更适合右值流,并且
  2. 按原样返回对流的引用,而不转换为std::ostream&amp;

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

要调用.str(),您可以手动将static_cast (std::ostringstream()&lt;&lt;value) 返回std::ostringstream&amp;(使用std::ostringstream &amp;&amp;const std::ostringstream&amp; 以实现libc++ 兼容性,因为它的右值流插入运算符返回对流的右值引用)。

【讨论】:

  • 谢谢大家,这有效!多么快速的解决方案!错误地阅读错误消息都是我的错:它必须阅读“str() 不是 std::ostream 的成员” 感谢您指出这一点并提供演员解决方案!
  • 若要使用 clang 编译,也需要一个 const:static_cast(std::ostringstream()
【解决方案2】:

在我的编译器中,它实际上是 sst.cpp(3) : error C2039: “str”: is not a member of “std::basic_ostream<char,std::char_trait s<char>>”。请注意,它是关于 ostream 而不是 ostringstream&lt;&lt;是为ostream定义的运算符(std::ostream::operator&lt;&lt;,可以参考this)。

因此,您实际上可以使用static_cast&lt;&gt;ostream 转换回ostringstream,因为返回的对象实际上属于后一类,如以下代码:

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

将编译。

【讨论】:

  • 不,它不会编译。
  • 呵呵,VS2013 比我想象的还要坏。演员表应该是std::ostringstream &amp;。不过,它实际上并不能正常工作 AFAICT(检查 str() 返回的内容)。
  • @T.C.使用 std::ostream const&amp; 应该没有问题。
  • @KonradRudolph 嗯?我不这么认为。
  • 是的,这是一个真正的问题,更新了我的代码。谢谢指正。
猜你喜欢
  • 2020-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多