자식클래스에서, 부모탬플릿 클래스의 맴버 변수 접근
글쓴이: aswip / 작성시간: 일, 2006/05/21 - 2:26오후
최근 탬플릿과 관련해서, 작업을 진행하는 도중, 부모 탬플릿을 상속받은 자식 템플릿에서
부모의 맴버변수에 접근하는 방법이 컴파일러 마다 다름을 확인하였습니다.
우선, 결론부터 말씀드리면, msvc 6 에서는 부모탬플릿의 맴버변수를 상속받으나,
gcc 4 에서는 상속받지 못하더군요. ^^;;
다음은 제가 테스트에 사용하였던 코드입니다.
<pre> #include <iostream> using namespace std; template<typename T> class CAnimal { public: CAnimal() { } virtual ~CAnimal() { } protected: int m_nAge; }; template<typename T> class CDog : public CAnimal<T> { public: CDog() { } ~CDog() { } void Init() { m_nAge = 10; } }; int main(int argc, char** argv) { CDog<int> dog; return 0; } </pre> </endcode> 참고로, gcc 4에서는 다음과 같은 컴파일에러가 발생합니다. main.cpp:41: error: 'm_nAge' was not declared in this scope 여러가지 해결책이 있겠지만, 가장 센스있는(?) ^^;; 해결방안을 모색하고자 조언을 요청합니다. 그럼 수고하십시요. ^^>
Forums:
this->m_nAge = 10;
m_nAge = 10; 를
this->m_nAge = 10; 으로 바꾸세요.
T에 대한 템플릿 부모 클래스가 있을 때 이것이 주어진 T에 따라
specialization 되었을 때 m_nAge 가 있을수도 / 없을 수도 있기에
템플릿 부모 클래스에서 상속 받은 것들을 호출하려고 하면,
일단 "없다!"고 결과가 나옵니다.
따라서 this-> 로 호출해서 "있다"고 알려주어야합니다.
혹은 using 문을 쓰기도 합니다. (자세한 문법은 저도 잘;)
Effective C++ 3판을 참고하세요.
--
Passion is like genius; a miracle.
--
Passion is like genius; a miracle.
상속을 받지
상속을 받지 않는다기보다는 m_nAge라는 이름을 찾지 못하는 것입니다.
템플릿 클래스의 경우 부모 템플릿 클래스는 name lookup의 범위에 들지 않으니까요.
예를 들어 다음과 같은 코드는 가능합니다.
그리고 pool007님이 언급하신 using을 쓰려면 이렇게 하면 됩니다.
댓글 달기