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

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

Patricia Arquette
Patricia Arquette원래의
2024-11-30 05:30:101019검색

How Can I Access Inherited Protected Variables from a Templated Parent Class in C  ?

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

이 코드 조각에서:

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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