c++ - 尝试在枚举值中组合标志
问题描述
试图构造一个简单的枚举来包含一组 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.5 20150623 (红帽 4.8.5-28)
解决方案
您的编译器似乎-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。)
推荐阅读
- postgresql - PostgreSql ,提取模式对象 DDL 到单独的 SQL 文件
- node.js - 如何从nodejs中的ElasticSearch批量查询
- python - Pandas 在匹配列中加入具有不同间隔的数据帧
- javascript - 将变量从一个函数传递到另一个函数
- python - 有没有办法随机打乱 Python 字典中的键和值,但结果不能有任何原始键值对?
- javascript - 如何在更改原点的 chrome-extension 中使用 fetch?
- object - 在数组对象类中找不到方法的符号
- sql - 当一列为空时,使用 db2 中的另一列
- python - UTC 时间戳转换为日期时间返回意外日期
- node.js - 一种逐一检查集合中所有数据的有效方法(nodejs、mongoose)