Reputation: 2932
I am using g++ to compile some code. I wrote the following snippet:
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);
And I receive these errors... any idea why?
Error 1: invalid conversion from ‘int’ to ‘std::_Ios_Openmode’
Error 2: initializing argument 2 of ‘std::basic_filebuf<_CharT, _Traits>* std::basic_filebuf<_CharT, _Traits>::open(const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits]’
As far as I could tell from a Google search, g++ is actually breaking the C++ standard here. Which I find quite astonishing, since they generally conform very strictly to the standard. Is this the case? Or am I doing something wrong.
My reference for the standard: http://www.cplusplus.com/reference/iostream/ofstream/open/
Upvotes: 5
Views: 6349
Reputation: 523284
g++ is not totally conforming, but it's not the reason for the error here.
The type of mode should be
std::ios_base::openmode
instead of
std::ios_base::open_mode
The latter is an old, deprecated API. It is still specified in Annex D of the C++ standard, so the compiler still have to support it.
Upvotes: 3
Reputation: 791849
This:
ios_base::open_mode Mode = std::ios_base::in | std::ios_base::binary;
should be:
std::ios_base::openmode Mode = std::ios_base::in | std::ios_base::binary;
Note the lack of _
in openmode
.
(I had to add these lines and put your code in a function to get your snippet to compile.
#include <string>
#include <fstream>
using std::string;
using std::ofstream;
using std::ios_base;
)
Upvotes: 2