템플릿 기반 상위 클래스에서 상속된 보호 변수에 액세스
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
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!