2012-05-25 2 views
5

의 모든 실패 갑자기 :QFlags 열거 형식 변환 내가 도서관에서 꽤 오랫동안 실행이 코드를 했어 갑자기

error C2664: 'QWidget::setWindowFlags': cannot convert parameter 1 from 'int' to 'Qt::WindowFlags' 

분명히 | QFlags 클래스에서 제공하는 연산자 오버로드로 인해 | QFlags 구조체가 아닌 int를 반환합니다.

수동으로 결과를 (Qt::WindowFlags)으로 캐스팅하고 작동 시키지만 QFlags는 일반적으로 이러한 종류의 캐스트를 필요 없게 만들 것입니다.

어떤 종류의 변경으로 인해 이러한 동작이 발생할 수 있습니다.

나는 일반적으로 충분할 <QtGui/QDialog>을 포함하고 있습니다. <QtCore/QFlags>을 포함하면 동작이 변경되지 않습니다.

답변

5

는 Qt는 글로벌 네임 스페이스의 열거 연산자를두고 할 대신 Qt 네임 스페이스가 있어야합니다. 현재 네임 스페이스에서 일치하는 다른 연산자가 있으면 컴파일러 will not search the parent scopes입니다. 네임 스페이스에 연산자에 대한 과부하를 추가하자마자 Qt의 오버로드는 일치 집합에 포함되지 않습니다. >QFlag - ->QFlagsint : 그것은 두 암시 적 변환을 필요로하기 때문에 2

Fèlix's answer below도 유효하지 않습니다. 비주얼 C++는 인해 long-standing bug에 동의하지만 대부분의 컴파일러는 그것을 거부합니다 : 모든 컴파일러에이 작동

error: no viable conversion from 'unsigned int' to 'Qt::WindowFlags' 
    (aka 'QFlags<Qt::WindowType>') 
Qt::WindowFlags f = Qt::CustomizeWindowHint | Qt::WindowTitleHint; 
       ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

을 : 하나의 변환이 필요합니다

Qt::WindowFlags f(Qt::CustomizeWindowHint | Qt::WindowTitleHint); 

때문에 : int ->QFlag합니다.

실제 해결책은 Qt가 조작자를 조작하는 유형과 동일한 네임 스페이스에 넣는 것입니다. 한편, 당신은 사업자 스스로를 가져올 수 있습니다 :이 의도하지 않은 결과를 초래할 수 있습니다

using ::operator|; 
setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowTitleHint); 

하는 것으로, 당신은 그들이 안 컨텍스트에서 사용할 수있는 이름을 많이하게 될 수있다.

1line 1733의 폐쇄 브래킷 line 58에 연 namespace Qt을 종료한다.

2ADL는 일반적으로 유형과 같은 네임 스페이스에 선언 연산자를 해결하는 데 사용되지만 운영자가 다른 네임 스페이스에있는 경우이 작동하지 않습니다.

+0

자세한 설명을 보내 주셔서 감사합니다. –

0

| 함수 호출에서 표현? 뭔가 같이 : 정확히 어디에 문제가 그것의 포함 문제의 경우

// .. 
Qt::WindowFlags flags = Qt::CustomizeWindowHint | Qt::WindowTitleHint; 
setWindowFlags(flags); 
// ... 

그냥

... 참조하십시오, 단지 #include <QtGui>

+0

두 줄로 나누면 잘 컴파일됩니다. 내 코드와 다른 점은 무엇입니까? 어쩌면 = 연산자일까요? –

+0

@ Fèlix 괄호가 귀하의 예제에서 페어링되지 않았습니다 – dschulz

+0

@dschulz 감사합니다! 내 실수! 이제 괜찮아. –

1

Q_DECLARE_OPERATORS_FOR_FLAGS을 사용하여 컴파일 오류가 발생하기 전의 네임 스페이스 어딘가에서 자신의 플래그를 선언하는지 확인하십시오.

마찬가지로 @isanae는 If there is another operator that matches in the current namespace, ...이라고 말했습니다. 따라서 일치하는 다른 연산자를 넣으면 안됩니다.

Qt가하는 것과 마찬가지로 모든 Q_DECLARE_OPERATORS_FOR_FLAGS 선언을 전역 네임 스페이스에 넣는 것이 해결책입니다.

희망이 있으면 도움이 될 수 있습니다. 나는 화일을 빌드 환경에 집어 넣을 때 같은 문제를 겪었고, 소스 코드의 순서를 바꾸고 마침내이 문제를 일으키는 코드 스 니펫을 찾았습니다. Q_DECLARE_OPERATORS_FOR_FLAGS 네임 스페이스 안에.