내가 C++에 조예가 깊어서 글을 남기는 것이 아니라, Effecitve C++ 을 공부하는 사람들이 이 글을 보고, 도움이 되었으면 하는 생각과, 혹시 내가 틀린것이 있다면 지적해 주시지 않을까 란 생각으로 글을 올리는것임을 미리 밝힙니다.  - 최익필


이번 항목의 주제는 "템플릿 기반 클래스를 상속받은 파생 클래스는 '컴파일 타임 상속 체계'가 끊긴다. 그러므로 템플릿 기반 클래스에 접근 하는 방법을 알아 두어야 한다." 이다.

이 컴파일 타임 상속 체계는 컴파일 타임에 컴파일러가 구문해석 체계를 뜻한다.
구문해석 체계에서 잘못 된 것이라면, 컴파일이 되지 않는다.

템플릿 기반 클래스 상속은 상속에 따른 구문해석이 끊기어, 해석 실패가 된다.
못 믿겠다면 예제 코드를 보자.

... 음.. 주석으로 표시된 곳에서 컴파일 타임 에러 나야 하는데, MSVC2005는 ..잘된다,  표준 방식을 안 따르는듯 보인다. 잘만 된다. 허허허허. .. 안되었다고 가정하고 이야기를 진행한다. ...(gcc 나 Boland C++ 등등. 컴파일러 종류가 워낙 많으니 안된다고 가정하는게 더 좋을 듯 싶다, 혹시 다른 컴파일러는 어떤지... 확인 가능하신분은 리플 부탁드립니다.)

그렇다! 컴파일이 되지 않는 다고 가정한다. 안된다! 왜냐하면 구문 해석 단계에서 TestDerived 가 무엇을 상속 받았는지 알지 못한다.(... 이건 컴파일러가 알수 있게 할수 있을거 같은데.. 어차피 상속이면 뭐..)

그렇기 때문에, 이것을 해결하려면 3가지 방법이 있다.
1. this->MsgBase() 형태로 호출, MsgBase() 가 상속됬다고, 컴파일러는 인식한다.
2. using 을 사용하여 이름 검색 범위를 기본까지 넒힌다.(이건 상속시 이름 가리기에서 배웠고)
3. TestBase::MsgBase(); 명시적 호출이다. 하지만 MsgBase() 가 가상 함수면, 낭패를 볼 수 있다.

아래는 다 테스트 한 코드이다.

1,2,3 번 방법으로 해결 할수 있다.


이것만은 잊지 말자!
1.템플릿 기반 파생 클래스는 템플릿 기반 클래스를 상속 받을때, 컴파일러 상속 구문해석이 끊기므로, 위의 3가지 방법으로 하면 해결 할수 있을 것이다.( 아마도 대부분의 컴파일러가 지원 할듯 싶다..)


관련링크
찾지 못했음. 아마도.. 대부분의 컴파일러가 지원해서, 없어도 되서 없는듯..?
신고
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요

  1. Favicon of http://blog.daum.net/killereco killereco 2008.07.28 10:19 신고  Addr  Edit/Del  Reply

    g++ 3.4.3.에서는 아래와 같은 에러가 납니다.
    gcc version 3.4.3 (csl-sol210-3_4-branch+sol_rpath)

    test.cpp: In member function `void TestDerived<_T>::MsgDerived()':
    test.cpp:38: error: there are no arguments to `MsgBase' that depend on a template parameter, so a declaration of `MsgBase' must be available
    test.cpp:38: error: (if you use `-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated)