2017-11-16 1 views
0

나는 커스텀 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의 인스턴스를 인스턴스화

은, 모든 플래그가 켜져 내 자신의 사용자 정의 QFlags 열거를 ... 만들었습니다. 단순히 ~A::PrimitiveTypeFlag::StringArray을 실행하면

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

, 나는 또한 동일한 오류가 발생합니다 : 난은 StringArray 플래그를 해제하려면 위의 코드 블록을 실행하면

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

, 나는이 오류가 발생합니다.

이 오류가 발생하는 이유는 무엇이며 어떻게 수정합니까?

미리 감사드립니다.

+1

버그, Qt 5.9.4 (아마도 5.10.1)로 고정되었습니다. – peppe

답변

2

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) 
+2

또는 Qt를 수정하십시오 ... https://codereview.qt-project.org/#/c/211806/ – peppe