我创建了自己的自定义 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/