안녕하세요. 천리안 프로그래머포럼 C++Builder 담당자 임펠리테리입니다.
음.. 자려고 하다가.. 말근샘물님은 올간만이시니까.. 답변을 드리고 잘께요.
Ambiguity 어쩌구.. 하는 에러는, 말그대로 모호하다는 뜻입니다.
C++에는 네임스페이스(namespace)라는 개념이 있는데, 다 설명드리려면 넘
장황해지고, 일단 클래스도 네임스페이스에 속하고, 또 이 네임스페이스마다
각각의 네이밍을 하기 때문에 네임스페이스가 다르면 같은 이름의 식별자를 가질 수
있습니다. 그런데.. vcl과 같은 대규모의 클래스 라이브러리, 더욱이 서드파티
컴퍼넌트들로 인한 확장까지 고려하면, 의도적이거나 혹은 우연히 식별자의 이름이
같아지는 수가 있습니다. 그러면 당연히 이 같은 이름을 가진 식별자들을 구별해주
어야 하는데.. 이럴때 네임스페이스 이름을 앞에 달아주고 ::해줌으로써 구별해주는
겁니다. 기본적인 vcl 엔 TForm이란 클래스이름은 하나뿐이라서, 그냥 TForm이라고
써주면 되지만, TAni~어쩌구 컴퍼넌트에 Tform을 상속받는 Tform이 또 하나 있죠.
그래서 네임스페이스 이름을 명시해줘야 합니다. 여기까지는 문제가 없죠.
메뉴아이템.. 이것도 사실, 말근샘물님이 하신 것이 맞습니다. 하지만 한가지
조치가 빠졌죠. 뭐냐면..
헤더파일에서 자동생성된, 그러니까 __published: 섹션에 있는 항목들은 반드시
폼 리소스(.dfm)의 각 엔트리(필드)와 1:1로 일치해야만 합니다. 말씀하신 에러
"Error in module ... :Incorrect field declaration in class ..."
이게 생기는 경우가 바로 이 경우입니다. 그러니까, dfm에는 TMenuItem으로 되어
있는데 헤더파일에서 AnimatedMenu98::TMenuItem로 했으니 1:1로 일치가 안되죠.
그러니까.. dfm 파일을 텍스트로 고친 다음 네임스페이스 이름을 적어주면 됩니다.
그런데 문제는, 이렇게 불일치 에러가 난 이후에는 어떤 동작을 해도, 그래서
view as text로 해서 보려고 해도 에러때문에 아무것도 안됩니다.
저장도 안되구요.
그래서.. 당장 생각나는 것은, 최악의 방법이군요. 일단 처음에 ambiguity 에러가
날때 저장하고, 빌더 바깥에서 폼은 convert.exe로 텍스트로 바꾸어서 편집하고
헤더도 역시 마찬가지로 편집한다음 불러들인다.. 이거 골때리는군요.
매번 프로젝트를 시작할때마다, 그리고 메뉴아이템을 추가할때마다 이렇게한다?
그건 곤란하겠고.. 근본적으로 문제를 잡으려면, 아무래도 animatedmenu 내의
메뉴아이템 선언을 손봐서, 이름을 바꿔놔야겠네요.
흠.. 다른 방법은 없을까..
아이고.. 골치아프네요. 일단은 위와 같은 방법으로 넘어가시구요.
방법이 떠오르면 다시한번 언급하도록 하겠습니다.
그럼 참고하시길..
독립문에서 임펠리테리였습니다.
(cbuilder, cbuilder@thrunet.com)
|