Vererbung von abstrakter Vorlagenklasse

Nov 24 2020

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 ues 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

1 AmiTavory Nov 24 2020 at 16:08

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 uSie meinen.

( coliru )

Es gibt mindestens zwei andere Möglichkeiten, indem Sie die Funktion vor dieser Zeile aufrufen B<T>::uoder eingeben using B<T>::u;.

Lesen Sie hier mehr darüber .