문제

Visual C ++에서는 다음과 같은 작업을 수행 할 수 있습니다.

template <class T>
class A{
protected:
    T i;
};

template <class T>
class B : public A<T>{
    T geti() {return i;}
};

g ++에서 이것을 컴파일하려고하면 오류가 발생합니다. 나는 이것을해야한다 :

template <class T>
class B : public A<T>{
    T geti() {return A<T>::i;}
};

표준 C ++에서 전자를하지 않아야합니까? 아니면 GCC와 오류가 오류를주는 무언가가 잘못 구성되어 있습니까?

도움이 되었습니까?

해결책

이것은 허용되었지만 변경되었습니다 GCC 3.4.

템플릿 정의에서, 자격이없는 이름은 더 이상 종속 기반의 멤버를 찾지 못합니다 (C ++ 표준에서 [temp.dep]/3에 의해 지정됨). 예를 들어,

    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
      }
    };

당신은 이름을 this->로 접두사하여 이름을 의존해야합니다. C :: H의 수정 된 정의는 다음과 같습니다.

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

다른 팁

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top