템플릿 추상 클래스에서 상속
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;
비록 u
A는 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;
이 있습니다.
여기에서 자세한 내용을 읽어보십시오 .