2014-12-30 7 views
0

wxWidgets를 사용하여 체스 프로그램을 작성하고 있습니다. 한순간에 나는 서브 클래스가 wxGLCanvas이고 Move 클래스를 사용합니다. 불행히도, 방법이 wxWindowBase::Move() 인 것 같아서 양식 list<Move> li의 모든 내 명령문은 컴파일되지 않습니다.멤버 함수와 클래스 이름 사이의 이름 충돌

해결 방법이 있습니까? list< ::Move> li을 시도했는데 문제가 해결되었지만 총체적 이었으므로 그 변화를 사방에 만들어야합니다. 네임 스페이스 충돌과 달리 사용 선언은 여기서는 도움이되지 않습니다.

+0

'사용'선언 (또는 'typedef'와 동일)을 시도한 적이 있습니까? – Potatoswatter

답변

3

메소드 이름으로 숨겨진 기본 클래스를 모호하게하는 몇 가지 방법이 있습니다.

typedef Move::Move Move_Base; // 1. the LHS of :: operator ignores functions 
using typename Move::Move; // 2. non-template "typename" avoids constructor 
typedef class Move Move_Base; // 3. elaborated type specifier 
typedef ::Move Move_Base; // 4. namespace qualification (as mentioned) 

(1)은 버그로 인해 GCC에서 작동하지 않을 수 있습니다. (잘 모르겠지만 시도해 볼 수 있습니다.)

(2) 아마도 가장 우아하지만 컴파일러는 C++ 11 뉘앙스를 올바르게 가져야합니다. typename 키워드는 C++ 03에서는 불법입니다.하지만 꼭 필요한 것은 아닙니다. C++ 11에서는 typename을 제외하고는 구문이 형식 이름 대신 생성자를 참조합니다.

상속 된 함수를 wxWindowBase::Move()으로 한정해야합니다.

(3)은 기본 클래스가 현재 네임 스페이스의 일부일 때만 작동합니다.

(4)는 다른 네임 스페이스로 이동하는 경우 해당 둘러싼 네임 스페이스에 대해 하드 코딩 된 클래스가 수정해야하므로 약간의 고통입니다. 당신이 말했듯이, 약간 추한.

+0

2)의 순열은 작동하지 않는 것처럼 보이지만 어떻게 든 typedef를 잊어 버렸습니다. 고맙습니다! –

+0

@HenrySwanson 흠, [GCC] (http://coliru.stacked-crooked.com/a/306b81401a5b46bd)는 선언을 수락하지만 Clang은 그렇지 않습니다. 이는 버그처럼 보입니다. 그러나 GCC는 여전히 (http://coliru.stacked-crooked.com/a/3b2cf5115e59aeac) 다른 선언문 인 모호성을 해결하는 것과 같은 선언을 해석하지 않습니다. – Potatoswatter

1

코드를 네임 스페이스에 넣으십시오. 그러면 수업은 something::Move이되며 쉽게 충돌하지 않습니다.

+0

같은 문제가있는 것 같습니다. 그것은 네임 스페이스의 차이 일뿐입니다. 내 .cpp 파일에서'something :: :: Move'를 사용할 수있어서'std :: list '와 같은 것이'list '이되고, 훨씬 더 읽을 수있는 IMO입니다. –

+0

이해가 안됩니다. 코드가'namespace something '에 있으면'list '을'사용'하지 않고 말할 수 있습니다. –

+0

나는 할 수있다. 그러나 여전히 메소드를'Move '하기 위해 클래스를'Move'하는 것은 잘못된 것이다. –