Jesse Beder
그는 물었다 12년 전
34

Mgcc 문제: 기본 클래스의 멤버로 사용하여 의존하는 포틀릿이 인수

다음 코드는 gcc 와 함께 doesn& # 39, t 컴파일하십시오 않지만, Visual Studio:

template <typename T> class A {
public:
    T foo;
};

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

저도 오류:

&gt. 테스트리코프: 의 멤버 함수 "void B&lt, T&gt, 표시줄에는 ()":

&gt. test.cpp:11: 오류: 이 범위를 선언된 않았다 "foo"

하지만 합니다! 만약 내가 &lt 변경하십시오 code&gt bar&lt /code>;;; 수

void bar() { cout << this->foo << endl; }

, t, but I 컴파일하십시오 don& # 39 는 그런 것 같아 이 일을 해야만 한다. 뭔가 다른 것을 공식 모두는 c++컴파일러는 mgcc 는 다음과 같은 임무야, 아니면 그냥 경구?

curiousguy
그는 8년 전 댓글을 달았습니다
0

참조 [받을시간은 체계화된 파생 클래스, 왜 데릭쉐퍼드와 검증하기 위한 기본 클래스 멤버 이름과 "this->" 멤버 함수를 인사이드라면?] (http://stackoverflow.com/questions/7908248/in-a-templated-derived-class-why-do-i-need-to-qualify-base-class-member-names-w)

George Robinson
그는 2년 전 댓글을 달았습니다
0

이 같은 일이 슬픔으로창백해지고 이 상 이름 조회 (기본적으로 사용하지 않는 모든 컴파일러에도). 4 가지 방법을 통해 이 문제를 해결할 수: 1) 경로재설정 접두사입니다 'A&lt, T&gt, 푸' 2) 경로재설정 접두사입니다 'this-&gt, foo' 3) 추가하기에서는 a&lt t&gt 푸 ',' 기술서임을 사용하여, 4) 사용할 수 있는 글로벌 컴파일러와의 스위치에서도 예비적 반소 모드. &Amp 장점. 이러한 통합 솔루션 (https://stackoverflow.com/questions/50321788/a-better-way-to-avoid-public-member-invisibility-and-source-code-bloat-repetitio) 에 설명되어 있습니다.

답변 5 개

데이비드 조이너 경식도 기록, 슬라이드에서는 있기 때문이다.

기본 클래스 '는', '그 때, 문제가 컴파일하기를 B&lt T&gt A&lt, T&gt,' 에서 알 수 없는 것을 알고 있기 때문에, 컴파일러, 템플릿 클래스에서 무리라구 모든 멤버를 컴파일러의 기본 클래스.

그러나 ISO C++ 템플릿 구문 분석 기본 클래스, 실제로 일부 이전 버전 아니하였으매 추론을 통해 밝힌 이 추론 이어질 수 있는 충돌함 안된다.

이 솔루션을 사용할 수 있는 기본 클래스 멤버 참조입니다 템플리트를 특별히 이름을 '이' (그것을비유하사 재발했지) 또는 기본 클래스:

template <typename T> class A {
public:
    T foo;
};

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

[Mgcc 수작업식] 에서 (자세한 내용은 http://gcc.gnu.org/onlinedocs/gcc-3.4 .6/gcc/name-lookup.html).

SirGuy
Derek Park
그는 12년 전 댓글을 달았습니다
8

한 손은 있는, 그런 게 유리합니다. 다른 한편으로, 기분이 정말 이상한. T , # 39 컴파일러 doesn& 할 때까지 알 수 있다 '는 foo 뭐라구오 템플릿에는 인스턴스화되지 그랬다면 인식할 수 있어야 한다' foo '멤버 중' A '. 이러한 이상한 건 너무 많은 c++컴파일러는 모퉁이점을 있다.

neu-rah
그는 6년 전 댓글을 달았습니다
0

그래, 이게 완전히 용납될 수 없다. 칸트, 예전에 잘 인스턴스화하지? 그럼 잠깐만 기다려 인스턴스 일반적으로 템플릿. # 39 의 정신을 that& it, no? 어떤 엉망하지.

와우. C++컴파일러는 더 나를 놀라게 한 색상에는 기괴함.

&gt. 정의를 찾을 수 있는 템플리트를 부적격 이름은 더 이상 멤버 종속적입니다 베이스 (지정되는 /3 [트럼퍼드프] 에서 C++ 표준). 예를 들어,

template <typename T> struct B {
  int m;
  int n;
  int f ();
  int g ();
};
int n;
int g ();
template <typename T> struct C : B<T> {
  void h ()
  {
    m = 0; // error
    f ();  // error
    n = 0; // ::n is modified
    g ();  // ::g is called
  }
};

&gt. 예를 들어, 함께 접두사를 지정하여 this-&gt 종속적입니다 이름을 만들어야 합니다. 다음은 교정됨 C&lt h, 정의, t&gt.

template <typename T> void C<T>::h ()
{
  this->m = 0;
  this->f ();
  this->n = 0
  this->g ();
}

&gt. 대안으로 솔루션 (죄송합니다. 호환됩니까 아니라 거꾸로 mgcc 3.3tb), 선언을 통해 this-&gt 대신 사용할 수 있습니다.

template <typename T> struct C : B<T> {
  using B<T>::m;
  using B<T>::f;
  using B<T>::n;
  using B<T>::g;
  void h ()
  {
    m = 0;
    f ();
    n = 0;
    g ();
  }
};

39 의 that& 그냥 모든 종류의 미친. 고마워, 데이비드.

39 의 &quot here& temp.dep/3";; 섹선에서 표준 (iso / iec 14882 2003년] 것을 예로 들 수 있다.

&gt. 클래스의 멤버 정의에 템플리트와 클래스 (base class) 또는 템플리트를 클래스의 경우, 기본 클래스 이름 없는 동안 종속된 템플리트를 템플리트를 매개변수입니다 유효범위 검토됩니다 시점에 오히려 조회 인컨텍스트 클래스의 멤버 중에 클래스 인스턴스 또는 정의마다 템플리트를 또는 템플리트를 또는 구성원. [예:

typedef double A; 
template<class T> class B { 
    typedef int A; 
}; 
template<class T> struct X : B<T> { 
    A a; // a has typedouble 
}; 

&gt. 이름, 유형 '에 대한 정의는' A ',' 에 이름이 정의되어 X&lt T&gt 바인딩됩니다 메리 페데프, 글로벌 이름공간이 유효범위 메리 페데프, 기본 클래스 ',' T&gt B&lt 이름이 정의되어 하지. ] [예:

struct A { 
    struct B { /* ... */ }; 
    int a; 
    int Y; 
}; 
int a; 
template<class T> struct Y : T { 
    struct B { /* ... */ }; 
    B b; //The B defined in Y 
    void f(int i) { a = i; } // ::a 
    Y* p; // Y<T> 
}; 
Y<A> ya; 

&gt. 멤버 'a b', '한' 및 'y' 의 템플리트를 인수 'a', ',' 에 영향을 미치지 않습니다 이름의 바인딩은 y&lt a&gt.]

[Gcc-3.4] [1] 이 바뀌었다. C++ 파서 attaboy 훨씬 더 엄격한 그 릴리스에는 - 그래도 좀 짜증나게 사양명세 따라 있는 사람들을 위한 레거시 또는 다중-플랫폼 코드 베이스를.

[1]: # 케플러스플루스 .4/changes.html http://gcc.gnu.org/gcc-3

무엇보다 중요한 것은 아무 것도 할 수 없는 특수한 유형의 기본 템플리트를 c++컴파일러는 solaris. 여기 있다. 계속 초기 예:

template<>
class A<int> {};

B<int> x; 
x.bar();//this will fail because there is no member foo in A<int>

39 이 상, t 구현됩니까 조회, vc doesn& mgcc 동안 않습니다. 그래서 그들은 더 이상 전에 mgcc 분석하고 템플릿일 인스턴스화되지 및 카타시안 aspt 오류뿐만 VC.

내 이름, & # 39 는 foo acrobatconnectcentral. 종속적이지만 의존하기 때문에, T& # 39;. 이 모든 것을 알 수 있는 위치에 있지 않다면 컴파일러와의 완료되니라 가져오기에서 유효성을 전혀 템플릿에는 인스턴스화하지 전에 이를 확인할 수 없습니다.

39 의 이유를 알 수 없는 곳에 that& 컴파일러와의 비롯됩니다.