4

我正在使用 g++ 编译一些代码。我写了以下片段:

bool WriteAccess = true;
string Name = "my_file.txt";
ofstream File;
ios_base::open_mode Mode = std::ios_base::in | std::ios_base::binary;
if(WriteAccess)
  Mode |= std::ios_base::out | std::ios_base::trunc;
File.open(Name.data(), Mode);

我收到这些错误......知道为什么吗?

错误 1:从 'int' 到 'std::_Ios_Openmode' 的无效转换<br> 错误 2:初始化 'std::basic_filebuf<_CharT, _Traits>* std::basic_filebuf<_CharT, _Traits>::open( const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits]'<p>

据我从谷歌搜索中得知,g++ 实际上在这里打破了 C++ 标准。我觉得这很令人惊讶,因为它们通常非常严格地符合标准。是这样吗?还是我做错了什么。

我对标准的参考:http ://www.cplusplus.com/reference/iostream/ofstream/open/

4

3 回答 3

4

openmode 是正确的类型,而不是 open_mode。

于 2010-06-03T20:08:38.777 回答
2

这个:

ios_base::open_mode Mode = std::ios_base::in | std::ios_base::binary;

应该:

std::ios_base::openmode Mode = std::ios_base::in | std::ios_base::binary;

请注意缺少_in openmode

(我必须添加这些行并将您的代码放入一个函数中以编译您的代码段。

#include <string>
#include <fstream>

using std::string;
using std::ofstream;
using std::ios_base;

)

于 2010-06-03T20:07:57.170 回答
2

g++ 并不完全符合,但这不是这里错误的原因。

模式的类型应该是

std::ios_base::openmode

代替

std::ios_base::open_mode

后者是一个旧的、已弃用的 API。在 C++ 标准的 Annex D 中仍然规定了它,因此编译器仍然必须支持它。

于 2010-06-03T20:09:36.407 回答