템플릿 추상 클래스에서 상속

Nov 24 2020

이 코드 구조가 있습니다.

  • 추상 클래스 A (순수한 가상 메서드가 있음)
  • A에서 상속 된 클래스 템플릿 B
  • B에서 상속되는 클래스 템플릿 C
class A
{
protected:
    int u;
    int z;

public:
    A(int uu,
      int zz)
    :u(uu),
     z(zz)
    {};

    int get() const
    {
    return u;
    };

    virtual void blah() = 0;
};

template <class T>
class B : public A
{
protected:
    std::vector<T> xxxx;
public:
    B(int uu,
      int zz,
      int bbb)
    :A(uu,
       zz)
    {
    for(size_t i = 0; i < bbb; i ++)
        xxxx[i] = 0;
    };

    virtual void blah()
    {
    u = u + 1;
    };
};

template <class T>
class C : public B<T>
{
protected:
    int qrqr;

public:
    C(int uu,
      int zz,
      int bbb,
      int qrqrqr)
    :B<T>(uu,
          zz,
          bbb),
     qrqr(qrqrqr)
    {
    };

    virtual void blah()
    {
    u = u + qrqr;
    };
};

컴파일 할 때이 오류가 발생합니다.

 
error: 'u' was not declared in this scope
    at line:  u = u + qrqr;

비록 uA는 B. 내지 C의베이스 때문에 명확 C의 요소 인

여기서 읽었습니다. 클래스 템플릿 상속 C ++ 클래스 템플릿에서 상속 하는 적절한 방법은 클래스를 전문화하거나 상속 된 클래스를 템플릿으로 만드는 것입니다. 이것이 제가 여기서 한 일입니다. 컴파일러는 어쨌든 그것에 대해 불평하지 않는 것 같습니다. A가 추상 클래스이기 때문일까요?

내가 뭘 잘못 했어?

감사!

답변

1 AmiTavory Nov 24 2020 at 16:08

이것은 비 종속적 이름 의 문제입니다. 참조하는 멤버는 템플릿 매개 변수에 의존하지 않습니다. 컴파일러는 비 종속 B<T>이름 (예 :)을 찾을 때 종속 기본 클래스 (예 :)를 찾지 않습니다 u.

다음을 사용하여 해결할 수 있습니다.

this->u = this->u + qrqr;

u의미 하는 컴파일러를 지정합니다 .

( 콜리 루 )

를 호출하거나이 줄 앞에 함수를 B<T>::u작성 하는 두 가지 이상의 다른 방법 using B<T>::u;이 있습니다.

여기에서 자세한 내용을 읽어보십시오 .