이 코드 조각에서:
template<class T> class Foo { public: Foo() { a = 1; } protected: int a; }; template<class T> class Bar : public Foo<T> { public: Bar() { b = 4; }; int Perna(int u); 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 }
GNU C 컴파일러의 최신 버전(예: 3.4 .6 및 4.3.2) 보고 오류:
error: `a' was not declared in this scope
Bar 전문화 내에서 기본 클래스 Foo의 보호된 변수 a에 액세스할 때.
최신 GCC 버전은 C 표준을 따릅니다. 이는 템플릿의 정규화되지 않은 이름이 비종속적이며 템플릿 정의 중에 해결되어야 함을 지정합니다. 현재 종속 기본 클래스의 정의가 알려지지 않았을 수 있으므로 정규화되지 않은 이름은 확인할 수 없습니다.
종속 기본 클래스에서 정규화되지 않은 상속 멤버의 액세스를 방지하면 템플릿이 잘 정의되어 있고 전문 분야와는 독립적입니다. 이렇게 하면 템플릿의 의미가 다양한 전문화에 대해 일관되게 유지됩니다.
Bar 내에서 상속된 변수에 액세스하려면 정규화된 이름을 사용할 수 있습니다.
template<class T> int Bar<T>::Perna(int u) { int c = Foo<T>::a * 4; return (Foo<T>::a + b) * u; }
또는 다음과 같이 using 선언을 사용할 수 있습니다.
template<class T> int Bar<T>::Perna(int u) { using Foo<T>::a; int c = a * 4; return (a + b) * u; }
이 구문은 컴파일러에 다음을 알립니다. Bar 범위에서 Foo 기본 클래스의 a 변수를 참조합니다.
위 내용은 C의 템플릿 기반 상위 클래스에서 상속된 보호 변수에 어떻게 액세스할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!