尝试在枚举值中组合标志
Trying to combine flags within enum value
尝试构造一个简单的枚举来包含一组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。
相关文章:
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 可组合的lambda/std::函数与std::可选
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 混合组合和继承的C++问题
- 我需要将多个函数组合为一个函数
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 通过组合不同的类型来创建唯一的id
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 模板元编程:如何将参数包组合成新的参数包
- 检查向量是否具有所有可能的字符组合
- 即使使用调试编译标志,表达式也是"optimized out"
- 在 CMake 中为每个目标设置编译器/链接器标志
- 如何在加密++中将两个源组合成新的源
- 根中的组合
- 更改 C++ 中的组合分类变量
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- File.cpp.o:OpenPose 标志 CMakeFiles/.. 的多重定义/main.cpp.o:首先在这里定
- 在轮班操作后使用携带标志
- 如何将组合标志结果反转为标志?
- 尝试在枚举值中组合标志