Ваш компилятор использует -std=c++98
по умолчанию.Вместо этого используйте флаг -std=c++11
, и код будет компилироваться.
В C ++ 98 вызовы функций (включая перегруженные вызовы операторов) не допускались в константных выражениях во время компиляции (так как семантики constexpr
не было)).
Тем не менее, не требуется для компиляции в соответствии со стандартом, даже с флагом:
Эта страница говорит std::ios::openmode
- это typedef
для типа, определяемого реализацией, удовлетворяющего концепции BitmaskType .
В то время как BitmaskType должен иметь перегрузки операторов для &
, |
и т. Д., Существуетнет никакой гарантии, что эти операторы являются constexpr, или что сам тип может быть преобразован в целочисленный тип.
Для максимальной совместимости вместо этого используйте простые const
переменные:
const std::ios::openmode TRUNCATE = std::ios::out | std::ios::trunc;
const std::ios::openmode APPEND = std::ios::out | std::ios::app;
(ЭтоРешение также будет работать с C ++ 98, если вы не можете использовать более новые стандарты.)