试图在枚举值内组合标志

时间:2018-06-05 20:21:05

标签: c++ enums

尝试构造一个简单的枚举来包含一组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(红帽4.8.5-28)

1 个答案:

答案 0 :(得分:3)

默认情况下,您的编译器似乎使用-std=c++98。请改用-std=c++11标志,代码将编译。

在C ++ 98中,编译时常量表达式中不允许函数调用(包括重载的操作符调用)(因为没有constexpr语义)。

尽管如此,即使使用标志,根据标准编译也不是必需

This pagestd::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。)