尝试在枚举值中组合标志



尝试构造一个简单的枚举来包含一组ios::标志,以便于引用,参数传递等。 我希望能够拨打电话:

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.520150623 (Red Hat 4.8.5-28(

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

在 C++98 中,编译时常量表达式中不允许使用函数调用(包括重载的 opeator 调用((因为没有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。

最新更新