>백엔드 개발 >C++ >C의 템플릿 기반 상위 클래스에 있는 보호된 상속 변수에 어떻게 액세스할 수 있습니까?

C의 템플릿 기반 상위 클래스에 있는 보호된 상속 변수에 어떻게 액세스할 수 있습니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-10 07:56:12414검색

How Can I Access Protected Inherited Variables in Templated Parent Classes in C  ?

템플릿 기반 상위 클래스에서 상속된 보호 변수에 액세스

C의 템플릿 기반 상위 클래스에서 보호된 상속 변수에 액세스하려고 하면 문제가 발생합니다. 다음 C 코드를 고려하십시오.

template<class T> class Foo {
    protected:
        int a;
};

template<class T> class Bar : public Foo<T> {
    protected:
        int b;
};

template<class T> int Bar<T>::Perna(int u) {
    int c = Foo<T>::a * 4; // This works
    return (a + b) * u;    // This doesn't
}

이 경우 GCC 버전 3.4.6 이상에서는 상속된 Foo 클래스의 보호 변수 a에 액세스하려고 하면 오류가 발생합니다. GCC 2.96 및 MSVC 6-9를 포함한 이전 컴파일러에서는 문제 없이 이 액세스를 허용합니다.

오류 설명

C 표준에 따르면 이 오류가 발생하는 이유는 템플릿의 이름은 템플릿 정의 중에 조회되어야 합니다. 그러나 종속 기본 클래스(예: 이 경우 Foo)의 정의는 템플릿 정의 시 알려지지 않을 수 있습니다. 이러한 불확실성으로 인해 자격이 없는 이름이 해결되는 것을 방지할 수 있습니다.

표준 준수

GCC 3.4.6 이상 버전에서 나타나는 동작은 C 표준을 준수합니다. 이러한 컴파일러는 표준을 준수함으로써 다양한 플랫폼과 컴파일러에서 코드 정확성과 동작이 일관되도록 보장합니다.

해결 방법

이 문제를 해결하고 보호된 상속에 액세스하려면 변수의 경우 변수의 정규화된 이름(예: Foo::a)을 사용하거나 "using" 선언을 활용할 수 있습니다. 예를 들면 다음과 같습니다.

template<class T>
int Bar<T>::Perna(int u) {
    int c = this->a * 4; // Access using the qualified name
    c = a * 4;          // Access using the "using" declaration
}

이 수정된 코드에서 정규화된 이름 또는 "using" 선언은 변수의 소스를 명시적으로 지정하므로 컴파일러가 변수를 올바르게 확인할 수 있습니다.

위 내용은 C의 템플릿 기반 상위 클래스에 있는 보호된 상속 변수에 어떻게 액세스할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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