>  기사  >  백엔드 개발  >  GCC를 사용하여 템플릿 파생 클래스의 기본 클래스 멤버에 액세스할 수 없는 이유는 무엇입니까?

GCC를 사용하여 템플릿 파생 클래스의 기본 클래스 멤버에 액세스할 수 없는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-02 16:08:02931검색

Why Can't I Access Base Class Members in a Template-Derived Class with GCC?

GCC 컴파일 오류: 템플릿 인수에 따라 기본 클래스 멤버에 액세스

C에서 템플릿 클래스에서 상속할 때 파생 클래스 내의 기본 클래스는 이 사용자가 직면하는 것처럼 때때로 문제를 일으킬 수 있습니다. 코드 조각이 제공됩니다.

<code class="cpp">template <typename T> class A {
public:
    T foo;
};

template <typename T> class B: public A<T> {
public:
    void bar() { cout << foo << endl; }
};</code>

이 코드를 GCC로 컴파일할 때 사용자에게 오류가 발생합니다.

error: ‘foo’ was not declared in this scope

그러나 문제가 있는 멤버 'foo'는 다음 내에서 액세스할 수 있어야 합니다. 파생 클래스입니다.

이 문제는 C 11 이상에서 컴파일러가 더 이상 중첩된 템플릿의 변수 유형을 자동으로 추론할 수 없다는 사실에서 발생합니다. 이러한 제한은 파생 클래스를 컴파일할 때 컴파일러가 기본 클래스에 'foo' 멤버의 존재를 유추하는 것을 방지합니다.

문제를 해결하려면 기본 클래스 이름을 통해 해당 멤버에 명시적으로 액세스할 수 있습니다.

<code class="cpp">void bar() { cout << A<T>::foo << endl; }

또는 'this' 포인터를 사용할 수 있습니다.

<code class="cpp">void bar() { cout << this->foo << endl; }</code>

이러한 솔루션은 'foo' 멤버가 기본 클래스에 속함을 명시적으로 나타내므로 컴파일러가 올바르게 식별할 수 있습니다. 사용법을 해결합니다.

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

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