C++ 为什么在使用自定义QFlags实现时会出现这种位操作错误?
我创建了自己的自定义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
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)中修复。