Class template in derrived class

Wie kann man eigentlich auf den Wert aus einem Template der Basisklasse in einer abgeleiteten Klasse zugreifen?

In dem Beispiel versuche ich auf a (also 42) in Derrived zuzugreifen.

template<int a>
class Base {
  protected:
    int arr[a];
    // int a_in_base = a;  // (4)
  public:
    Base() {}
};

class Derrived : public Base<42> {
  protected:
    //int a_in_derrived = a;   // error: 'a' was not declared in this scope (1)
    //int arr_b[a];            // error: 'a' was not declared in this scope (2)
    //int arr_b[Base<a>::a];   // error                                     (3)

  public:
    Derrived() {}
};

Derrived test;

void setup() {
  Serial.begin(115200);
}

void loop() {}

1,2,3 schlagen fehl.
4 würde gehen, aber ich will eigentlich nicht den Wert zusätzlich in der Basisklasse halten.

1 Like

Hallo,

du möchtest dieses 'a' aus der Basisklasse ...

template<int a>
class Base {
  protected:
    int arr[a];
    // int a_in_base = a;  // (4)
  public:
    Base() {}
};

in der Derrived Klasse verwenden? Das geht nicht, weil a in Base kein Element ist. 'a' wird direkt eingesetzt. Wenn Derrived 'a' aus Base verwenden soll, muss 'a' ein Element von Base sein. Also funktioniert nur Fall (4) wäre die Antwort.

Außer du reichst 'a' als Parameter per Konstruktor von Derrived zu Base durch. Was passen würde, weil du erstellst von Derrived eine Instanz und nicht von Base. Vielleicht möchtest du auch nicht Base vererben sondern in Derrived eine Instanz von Base erstellen und verwenden.

1 Like

Der Wert steckt schon im Type!
Darum geht sowas: (ohne ein Byte zu kosten)

template<size_t a>
class Base {
  protected:
    int arr[a];
    // int a_in_base = a;  // (4)
  public:
    static constexpr size_t anzahl {a};
    Base() {}
};

class Derrived : public Base<42> {
  protected:
    //int a_in_derrived = a;   // error: 'a' was not declared in this scope (1)
    //int arr_b[a];            // error: 'a' was not declared in this scope (2)
    //int arr_b[Base<a>::a];   // error                                     (3)

  public:
    Derrived() {}
    void test()
    {
      Serial.println(anzahl);
    }
};

Derrived test;

void setup() {
  Serial.begin(9600);
}

void loop() {}
2 Likes

"es kostet kein byte" wegen dem constexpr ?

Ja.
Weil die numerische Information im Datentype Base<42> selber festgelegt ist.
Man benötigt nur einen Namen/Bezeichner um ihn anfassen zu können.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.