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

C++ 为什么在使用自定义QFlags实现时会出现这种位操作错误?,c++,qt,hex,qt5,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, UIn

我创建了自己的自定义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
,我也会得到同样的错误

为什么会出现此错误,如何修复

提前感谢。

被用作纯枚举,通过禁止对其基础类型的隐式转换,使用起来更安全。这对您很有影响,因为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)
要用作纯枚举,这通过禁止对其基础类型的隐式转换使它们使用起来更安全。这对您很有影响,因为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)
Bug,在Qt5.9.4(可能是5.10.1)中修复。Bug,在Qt5.9.4(可能是5.10.1)中修复。