>백엔드 개발 >C++ >C의 파생 템플릿 클래스에서 기본 클래스 식별자에 액세스할 수 없는 이유는 무엇입니까?

C의 파생 템플릿 클래스에서 기본 클래스 식별자에 액세스할 수 없는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-19 00:10:02407검색

Why Are Base Class Identifiers Inaccessible in Derived Template Classes in C  ?

파생 템플릿 클래스의 제한된 식별자 가시성

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::NO_ZEROFILL을 사용하면 T의 구체적인 유형이 아니더라도 기본 클래스에서 식별자를 찾도록 컴파일러에 명시적으로 지시됩니다.

따라서 파생 템플릿 클래스에서 기본 템플릿 클래스에 정의된 식별자는 명시적인 자격을 통해서만 액세스할 수 있으므로 런타임 시 올바른 해결이 보장됩니다. 템플릿은 특정 유형으로 인스턴스화됩니다.

위 내용은 C의 파생 템플릿 클래스에서 기본 클래스 식별자에 액세스할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.