奇怪的错误:无法从'int'转换为'ios_base :: openmode'

时间:2010-06-03 19:51:44

标签: c++ standards-compliance ofstream

我正在使用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' 错误2:初始化'std :: basic_filebuf< _CharT,_Traits> * std :: basic_filebuf< _CharT,_Traits> :: open(const char *,std :: _ Ios_Openmode)的参数2 [与_CharT = char,_ Traits = std: :char_traits]'

据我在谷歌搜索中所知,g ++实际上在这里打破了C ++标准。我发现它非常令人惊讶,因为它们通常严格遵守标准。是这样的吗?或者我做错了什么。

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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;

请注意_中缺少openmode

(我必须添加这些行并将您的代码放在一个函数中,以便让您的代码段能够编译。

#include <string>
#include <fstream>

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

答案 2 :(得分:1)

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

模式的类型应为

std::ios_base::openmode

而不是

std::ios_base::open_mode

后者是旧的,已弃用的API。它仍然在C ++标准的附录D中指定,因此编译器仍然必须支持它。