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::ostringstream
的operator<<
仍然是returnsstd::ostream&
(它从std::ostream
继承了这些运算符),它没有str()
成员.
Clang/libc++(Xcode 使用的)在其右值流插入运算符中实现了一个扩展
- 与继承的成员
operator<<
s 和 相比,它更适合右值流
- 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();
}
将编译。
我有一个 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::ostringstream
的operator<<
仍然是returnsstd::ostream&
(它从std::ostream
继承了这些运算符),它没有str()
成员.
Clang/libc++(Xcode 使用的)在其右值流插入运算符中实现了一个扩展
- 与继承的成员
operator<<
s 和 相比,它更适合右值流
- 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();
}
将编译。