我正在使用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/
答案 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中指定,因此编译器仍然必须支持它。