Vererbung von abstrakter Vorlagenklasse
Ich habe diese Codestruktur:
- Eine abstrakte Klasse A (sie hat eine rein virtuelle Methode)
- Eine Klassenvorlage B, die von A erbt
- Eine Klassenvorlage C, die von B erbt
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;
};
};
Beim Kompilieren erhalte ich folgende Fehlermeldung:
error: 'u' was not declared in this scope
at line: u = u + qrqr;
Obwohl u
es eindeutig ein Element von C ist, weil A eine Basis von C bis B ist.
Ich habe hier gelesen: Klassenvorlagenvererbung C ++, dass der richtige Weg, um von Klassenvorlagen zu erben, entweder darin besteht, die Klasse zu spezialisieren oder die geerbte Klasse als Vorlage zu haben, und das habe ich hier getan. Der Compiler scheint sich sowieso nicht darüber zu beschweren. Könnte es sein, dass A eine abstrakte Klasse ist?
Was habe ich falsch gemacht?
Vielen Dank!
Antworten
Dies ist ein Problem mit einem nicht abhängigen Namen. Das Mitglied, auf das Sie sich beziehen, hängt nicht vom Vorlagenparameter ab. Der Compiler sucht nicht in abhängigen Basisklassen (wie B<T>
), wenn nicht abhängige Namen (wie u
) gesucht werden .
Sie können es mit lösen
this->u = this->u + qrqr;
Dies gibt dem Compiler an, was u
Sie meinen.
( coliru )
Es gibt mindestens zwei andere Möglichkeiten, indem Sie die Funktion vor dieser Zeile aufrufen B<T>::u
oder eingeben using B<T>::u;
.
Lesen Sie hier mehr darüber .