Странная ошибка: невозможно преобразовать из int в ios_base :: openmode - PullRequest
4 голосов
/ 03 июня 2010

Я использую 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: инициализация аргумента 2 для 'std :: basic_filebuf <_CharT, _Traits> * std :: basic_filebuf <_CharT, _Traits> :: open (const char *, std :: _ Ios_Openmode) [with _CharT = char, _Traits = std: : char_traits]

Насколько я могу судить по поиску в Google, g ++ фактически нарушает стандарт C ++. Который я нахожу довольно удивительным, так как они вообще очень строго соответствуют стандарту. Это тот случай? Или я что-то не так делаю.

Моя ссылка на стандарт: http://www.cplusplus.com/reference/iostream/ofstream/open/

Ответы [ 3 ]

4 голосов
/ 04 июня 2010

openmode - правильный тип, а не open_mode.

2 голосов
/ 04 июня 2010

Это:

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;

)

1 голос
/ 04 июня 2010

g ++ не полностью соответствует, но это не является причиной ошибки здесь.

Тип режима должен быть

std::ios_base::openmode

вместо

std::ios_base::open_mode

Последний является устаревшим устаревшим API.Он все еще указан в Приложении D к стандарту C ++, поэтому компилятор все еще должен его поддерживать.

...