C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[4881] Re:[질문] rxLib2.75에서 에러 -> 자동 헤더 생성과 네임스페이스 관련입니다
박지훈.임프 [cbuilder] 5148 읽음    2001-01-12 17:45
hurjiwoo 님이 쓰신 글 :
: 안녕하세요....
:
: 전
: 썬더버드 750에
: w2k 영문 서버에다가
: c++ builder 5.0을깔고 업데이트 1번을 설치한 상태에서요..
:
: rx2.75에 빌더5용 패치를 받아서 설치를 했습니다.
: 근데.....
:
: RxRichEdit를 놓고 컴파일을 하면 에러가 납니다...
: 내용은요....
: [C++ Error] RxRichEd.hpp(38): E2015 Ambiguity between 'CHARFORMAT2A' and 'Richedit::CHARFORMAT2A'
: [C++ Error] RxRichEd.hpp(411): E2015 Ambiguity between 'CHARFORMAT2A' and 'Richedit::CHARFORMAT2A'
: [C++ Error] RxRichEd.hpp(431): E2015 Ambiguity between 'CHARFORMAT2A' and 'Richedit::CHARFORMAT2A'
: [C++ Error] RxRichEd.hpp(448): E2015 Ambiguity between 'CHARFORMAT2A' and 'Richedit::CHARFORMAT2A'
:
: 이런 에러가 납니다.
:
: 에러가 난 곳은
: RxRichEd.hpp의
:
: typedef CHARFORMAT2A  TCharFormat2;
:
: 이부분입니다.....
:
: www.rxlib.com에도 가봤는데 없어요....
: 어디가 문제인지 전혀 감이 안잡힙니다...
: 도와주세요
:

임펠리테리입니다.

일반적으로 Ambiguity 컴파일러 에러는 이미 설치된 다른 라이브러리(보통은 컴퍼넌트)의 어떤 타입(클래스도 포함)이 새로 설치한 컴퍼넌트의 같은 이름의 타입과 충돌하는 경우에 발생합니다. 간단히 말해, 컴파일러가 이렇게 불평하는 거죠. "이건지 저건지 선택을 못하겠다! 좀 더 자세히 지정해줘!"

VCL의 RichEdit.pas(그리고 이게 컴파일되어 생기는 RichEdit.hpp)에는 컴파일에러대로 'CHARFORMAT2A'라는 이름의 클래스가 선언되어 있습니다. 그리고 Rx의 리치에디트 모듈인 RxRichEd.pas에도 이게 포함되어 있구요. 에러 메시지는 바로 요 두 가지 타입이 이름이 같아서 모호하다는 걸 말합니다. C++은 다양한 모듈을 컴파일해서 링크할 때 이름충돌이 일어나는 것을 막을 수 있도록 네임스페이스(namespace)라는 것을 지원하는데 프로그래머가 코드의 특정 부분에 네임스페이스를 설정하면 그 네임스페이스를 지정함으로써 유일한 이름이 되도록 할 수 있습니다. 이 네임스페이스는 오브젝트 파스칼에서는 별도로 지정할 수 없으며, 모든 모듈은 기본적으로 자체 모듈 이름의 네임스페이스가 내포적으로 지정됩니다. C++에서는 명시적으로 지정해야 하구요.

빌더가 파스칼 모듈을 컴파일하게 되면 빌더에서 사용할 수 있도록 hpp파일을 생성한다는 것은 아시지요? 이 자동으로 hpp 파일을 생성하는 구조에 따라 파스칼 모듈을 컴파일하면 원래의 파스칼 모듈과 동일한 의미가 될 수 있도록 자동으로 네임스페이스를 설정해줍니다. *.hpp 파일을 열어보시면 모든 파일에 다음과 같이 블럭이 설정되어 있는 것을 알 수 있습니다.
namespace 모듈이름
{
...
}    /* namespace 모듈이름 */

그런데, 이 hpp 생성 구조가 아주 완벽한 것은 아니어서 말씀하신 것과 같은 문제가 발생합니다. Rx의 것과 디폴트 리치에디트에서 사용하는 CHARFORMAT2A 타입이 이름이 같으므로 네임스페이스가 같으므로 반드시 네임스페이스가 설정되어야 하는데, 파스칼에서는 물론 내포적으로 설정되므로 신경 안써도 됩니다. 그런데, 아까 말씀드린 것과 같이 빌더에서 생성하는 hpp 파일에도 자동으로 네임스페이스가 설정되는데, 네임스페이스 내부에서 다시 네임스페이스 내에서 선언한 타입을 사용할 경우에 네임스페이스를 지정해야 하는데(파스칼에서는 기본적으로 잡힙니다) 빌더의 자동 헤더 생성은 네임스페이스 지정을 하지 않습니다. 다시 말해, 어느 네임스페이스에 속한 타입인가를 지정해야 한다는 말입니다. 빌더의 버그라고도 생각할 수 있겠지만, 프로그래머가 판단해야 할 문제이므로 자동으로 생성하는 빌더가 결정할 수는 없는 문제죠.

그래서 장황설은 끝내고, 해결책은... 그냥 RxRichEd.hpp 파일내에서 에러가 난 라인들에서 CHARFORMAT2A라고 쓰인 부분은 몽땅 ::CHARFORMAT2A 라고 바꾸면 됩니다. (::를 추가하라는 말입니다) ::를 추가하는 것은, 현재 속한 네임스페이스를 지정하는 것입니다. 생성된 RxRichEd.hpp 파일에 보면 네임스페이스가 Rxriched라는 이름으로 설정되어 있습니다. 그러므로 ::CHARFORMAT2A 라고 하는 것은 Rxriched::CHARFORMAT2A라고 하는 것과 동일합니다.

그럼 참고하시길...

+ -

관련 글 리스트
4872 [질문] rxLib2.75에서 에러가 납니다. hurjiwoo 2885 2001/01/12
4881     Re:[질문] rxLib2.75에서 에러 -> 자동 헤더 생성과 네임스페이스 관련입니다 박지훈.임프 5148 2001/01/12
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.