c++ - 为什么在使用自定义 QFlags 实现时会出现这种按位操作错误?

标签 c++ qt hex qt5

我创建了自己的自定义 QFlags 枚举...

class A
{
  ...

  enum class PrimitiveTypeFlag : unsigned int {
    Unknown = 0x0,
    Bool = 0x1,
    Float = 0x2,
    Double = 0x4,
    Int8 = 0x8,
    UInt8 = 0x10,
    Int16 = 0x20,
    UInt16 = 0x40,
    Int32 = 0x80,
    UInt32 = 0x100,
    Int64 = 0x200,
    UInt64 = 0x400,
    StatsDataArray = 0x800,
    NeighborList = 0x1000,
    StringArray = 0x2000,
    NumericalPrimitives = 0x07FE,
    Any = 0x3FFF
  };
  Q_DECLARE_FLAGS(PrimitiveTypeFlags, PrimitiveTypeFlag)
  ...
  ...
};
Q_DECLARE_OPERATORS_FOR_FLAGS(A::PrimitiveTypeFlags)

当我实例化 PrimitiveTypeFlags 的实例时,所有标志都已打开。

A::PrimitiveTypeFlags pFlags;
pFlags.setFlag(A::PrimitiveTypeFlag::StringArray, false);

当我执行上面的代码块以关闭 StringArray 标志时,出现此错误:

invalid argument type 'A::PrimitiveTypeFlag' to unary expression.

如果我简单地执行 ~A::PrimitiveTypeFlag::StringArray,我也会得到同样的错误。

为什么会出现此错误,我该如何解决?

提前致谢。

最佳答案

enum classes旨在用作纯枚举,这通过禁止对其基础类型的隐式转换使它们使用起来更安全。这让您大吃一惊,因为 QT 宏期望能够对传入的值执行位操作。

您应该能够通过使用 C++11 之前的枚举声明来解决此问题:

class A
{
  ...

  enum PrimitiveTypeFlag : unsigned int {
    Unknown = 0x0,
    Bool = 0x1,
    Float = 0x2,
    Double = 0x4,
    Int8 = 0x8,
    UInt8 = 0x10,
    Int16 = 0x20,
    UInt16 = 0x40,
    Int32 = 0x80,
    UInt32 = 0x100,
    Int64 = 0x200,
    UInt64 = 0x400,
    StatsDataArray = 0x800,
    NeighborList = 0x1000,
    StringArray = 0x2000,
    NumericalPrimitives = 0x07FE,
    Any = 0x3FFF
  };
  Q_DECLARE_FLAGS(PrimitiveTypeFlags, PrimitiveTypeFlag)
  ...
  ...
};
Q_DECLARE_OPERATORS_FOR_FLAGS(A::PrimitiveTypeFlags)

关于c++ - 为什么在使用自定义 QFlags 实现时会出现这种按位操作错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47336140/

相关文章:

c++ - 如何正确标记字符串

c++ - 使用 fgets() 时出错

c++ - 使用在 ios 上运行的 qt 应用程序构建 boost

c++ - 具体QPushButton样式

Qt 方形单选按钮

powershell - 如何将十六进制编码的字符串转换为十六进制整数

c++ - 作为模板类中的参数的函数

c++ - 我需要分发一个头文件和一个带有 DLL 的 lib 文件吗?

javascript - 在 JavaScript 中将带有哈希值的十六进制字符串转换为带有 0x 的十六进制值的最佳方法?

python - 当Python中附加了字节标记时,如何将字节转换为整数?