I think this is a bug (and know it's annoying). Thanks for investigating. In the libstdc++ included with gcc-4.2.6 (apparently also in trunk), bits/ios_base.h defines two "open mode" types: std::ios_base::openmode is a typedef of _Ios_Openmode, whereas std::ios_base::open_mode is a typedef of int. I'm guessing that the latter was defined for compatibility with compilers like MSVC that would let you use the two synonymously. However, it doesn't work:
~ $ cat > test.cpp <<EOF > #include <fstream> > int main() > { > std::ios_base::open_mode m = std::ios_base::in; > std::fstream f(__FILE__, m); > } > EOF ~ $ g++ -v test.cpp Using built-in specs. Target: i686-pc-linux-gnu Configured with: /var/tmp/portage/sys-devel/gcc-4.2.4/work/gcc-4.2.4/configure --prefix=/usr --bindir=/usr/i686-pc-linux-gnu/gcc-bin/4.2.4 --includedir=/usr/lib/gcc/i686-pc-linux-gnu/4.2.4/include --datadir=/usr/share/gcc-data/i686-pc-linux-gnu/4.2.4 --mandir=/usr/share/gcc-data/i686-pc-linux-gnu/4.2.4/man --infodir=/usr/share/gcc-data/i686-pc-linux-gnu/4.2.4/info --with-gxx-include-dir=/usr/lib/gcc/i686-pc-linux-gnu/4.2.4/include/g++-v4 --host=i686-pc-linux-gnu --build=i686-pc-linux-gnu --disable-altivec --enable-nls --without-included-gettext --with-system-zlib --disable-checking --disable-werror --enable-secureplt --disable-multilib --enable-libmudflap --disable-libssp --disable-libgcj --with-arch=i686 --enable-languages=c,c++,treelang,fortran --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu Thread model: posix gcc version 4.2.4 (Gentoo 4.2.4 p1.0) /usr/libexec/gcc/i686-pc-linux-gnu/4.2.4/cc1plus -quiet -v -D_GNU_SOURCE test.cpp -quiet -dumpbase test.cpp -mtune=generic -march=i686 -auxbase test -version -o /tmp/ccgqbb9I.s ignoring nonexistent directory "/usr/lib/gcc/i686-pc-linux-gnu/4.2.4/../../../../i686-pc-linux-gnu/include" #include "..." search starts here: #include <...> search starts here: /usr/lib/gcc/i686-pc-linux-gnu/4.2.4/include/g++-v4 /usr/lib/gcc/i686-pc-linux-gnu/4.2.4/include/g++-v4/i686-pc-linux-gnu /usr/lib/gcc/i686-pc-linux-gnu/4.2.4/include/g++-v4/backward /usr/local/include /usr/lib/gcc/i686-pc-linux-gnu/4.2.4/include /usr/include End of search list. GNU C++ version 4.2.4 (Gentoo 4.2.4 p1.0) (i686-pc-linux-gnu) compiled by GNU C version 4.2.4 (Gentoo 4.2.4 p1.0). GGC heuristics: --param ggc-min-expand=98 --param ggc-min-heapsize=128021 Compiler executable checksum: 38f256a84cbf67f10c0ecc41dbb48f1d test.cpp: In function âint main()â: test.cpp:5: error: invalid conversion from âintâ to âstd::_Ios_Openmodeâ test.cpp:5: error: initializing argument 2 of âstd::basic_fstream<_CharT, _Traits>::basic_fstream(const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits<char>]â ~ $ # Of course, the code works fine if openmode is used instead: ~ $ sed -i 's/open_mode/openmode/' test.cpp ~ $ g++ test.cpp ~ $ echo $? 0 -- Summary: std::ios_base::open_mode is defined but useless Product: gcc Version: 4.2.5 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: justinb at math dot berkeley dot edu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36427