尝试构造一个简单的枚举来包含一组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。