파생 템플릿 클래스의 제한된 식별자 가시성
C에서 템플릿 클래스는 상속에 고유한 측면을 도입합니다. 즉, 기본 템플릿 클래스에 정의된 식별자입니다. 파생된 템플릿 클래스에는 표시되지 않을 수 있습니다. 2단계 조회라고 알려진 이 동작은 템플릿 인스턴스화 및 컴파일과 관련된 여러 단계로 인해 발생합니다.
다음 예를 고려하세요.
template <typename T> class Base { public: static const bool ZEROFILL = true; static const bool NO_ZEROFILL = false; }; template <typename T> class Derived : public Base<T> { public: Derived(bool initZero = NO_ZEROFILL); // NO_ZEROFILL is not visible ~Derived(); };
이 코드를 컴파일할 때 GCC g 3.4.4(cygwin)에서는 Derived가 기본 클래스 Base에서 NO_ZEROFILL에 액세스할 수 없기 때문에 오류가 발생합니다. 이는 템플릿 인스턴스화의 첫 번째 단계에서 컴파일러가 코드를 구문 분석할 때 T에 할당된 구체적인 유형이 없기 때문입니다. 결과적으로 Derived가 상속하는 특정 기본 클래스를 확인할 수 없으므로 정의된 식별자를 확인할 수 없습니다.
이 제한을 극복하려면 파생 템플릿 클래스의 기본 클래스 식별자에 액세스할 때 명시적인 한정이 필요합니다. 아래 코드는 문제를 해결합니다.
template <typename T> class Derived : public Base<T> { public: Derived(bool initZero = Base<T>::NO_ZEROFILL); // Explicit qualification ~Derived(); };
Base
따라서 파생 템플릿 클래스에서 기본 템플릿 클래스에 정의된 식별자는 명시적인 자격을 통해서만 액세스할 수 있으므로 런타임 시 올바른 해결이 보장됩니다. 템플릿은 특정 유형으로 인스턴스화됩니다.
위 내용은 C의 파생 템플릿 클래스에서 기본 클래스 식별자에 액세스할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!