Попытка объединить флаги в пределах значения перечисления - PullRequest
0 голосов
/ 05 июня 2018

Попытка создать простое перечисление, содержащее набор ios :: flags для более удобной ссылки, передачи параметров и т. Д. Я хочу иметь возможность сделать вызов:

resultCode = DoSomething(param, TRUNCATE);

ResultCode DoSomething(int param, FileOperation_t operation) {...}

Я определил свойПеречислим так:

typedef enum {
    TRUNCATE = std::ios::out | std::ios::trunc,
    APPEND   = std::ios::out | std::ios::app
} FileOperation_t;

Компиляция этого приводит к:

error: calls to overloaded operators cannot appear in a constant-expression
     TRUNCATE = std::ios::out | std::ios::trunc,
                                          ^

Я не понимаю, что означает эта ошибка.Что я делаю здесь не так и как мне выполнить то, что я пытаюсь сделать?

gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28)

1 Ответ

0 голосов
/ 05 июня 2018

Ваш компилятор использует -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, если вы не можете использовать более новые стандарты.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...