我在Visual 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(); 我在这里错过了什么?谢谢!
发布于 2015-04-20 10:01:10
错误消息是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>> aka std::ostream中失踪,而不是std::ostringstream。
std::ostringstream的operator<<仍然返回std::ostream& (它从std::ostream继承这些运算符),后者没有str()成员。
Clang/libc++ ( Xcode使用的)在其rvalue流插入运算符中实现了一个扩展,
operator<<相比,它更好地匹配rvalue流,std::ostream&。这使得您的代码可以在Xcode中编译。
要调用.str(),可以手动将static_cast (std::ostringstream()<<value)返回到std::ostringstream& (为libc++兼容性使用std::ostringstream &&或const std::ostringstream&,因为它的rvalue流插入操作符返回对流的rvalue引用)。
发布于 2015-04-20 10:12:45
根据我的编译器,它实际上是sst.cpp(3) : error C2039: “str”: is not a member of “std::basic_ostream<char,std::char_trait s<char>>”。请注意,它是关于ostringstream.而不是ostream的。<<是为ostream定义的运算符(std::ostream::operator<<,您可以引用这)。
因此,您实际上可以使用ostream将ostringstream转换回static_cast<>,因为返回的对象实际上属于后一个类,如下所示:
#include<sstream>
void main(...){
(static_cast<std::ostringstream&>(std::ostringstream() << 0)).str();
}会编译。
https://stackoverflow.com/questions/29744622
复制相似问题