gpt4 book ai didi

c++ - 尝试在枚举值中组合标志

转载 作者:太空狗 更新时间:2023-10-29 21:11:24 30 4
gpt4 key购买 nike

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

最佳答案

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

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


不过,不需要根据标准编译,即使有标志:

This page 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。)

关于c++ - 尝试在枚举值中组合标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50708342/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com