Forum: Compiler & IDEs Problem beim ableiten von templates


von Axel B. (axelb)


Lesenswert?

Hallo erstmal an alle,

Ich habe da mal ein C++ problem mit dem GCC.

Ich erzeuge eine template Basisklasse TBase und leite davon eine weitere 
template klasse ab. In der abgeleiteten Klasse kann ich weder auf die 
Membervariablen, noch auf die Funktionen der Basisklasse zugreifen.

Siehe folgenden Quellcode:


template <int N> class TBase {
public:
  int     Array[N];
  int     fb1() { return Array[0]; };
};                                     // Bis hier ist alles OK

template <int NN> class TDerived : public TBase<NN> {
  int     UU;
public:
  int     fc2() { return Array[0]; };  // error: 'Array' was not 
declared in this scope
  int     fc3() { return UU; };        // OK
  int     fc4() { return fb1(); };     // error: .... 'fb1' must be 
available
};                                     // Hier ist von der Basisklasse 
nichts mehr sichtbar, obwohl alle Member und Funktionen public sind

int main() {
  TDerived<10> Derived;
  Derived.Array[2] = 5;   // OK
  Derived.UU = 1;         // correct error, because UU is private
  Derived.fb1();          // OK
  return 0;
}

Wenn ich nun ein Objekt von der abgeleiteten Klasse erzeuge, dann kann 
ich auch wieder auf die Basisklassen Member zugreifen.

Der gleiche Code kompiliert unter Borland CBuilder, Microsoft visual 
studio 6 und einem anderen embedded compiler von microtec.

Gibts da einen Kompilerschalter beim GCC der das aendert, ich hab nichts 
gefunden.


vielen dank im vorraus.

Axel

von Rolf Magnus (Gast)


Lesenswert?

Axel B. schrieb:

> In der abgeleiteten Klasse kann ich weder auf die Membervariablen, noch
> auf die Funktionen der Basisklasse zugreifen.

Doch, kannst du schon, aber nicht so, wie du es von nicht-templates 
gewöhnt bist. Du mußt den Scope explizit angeben.

>   int     fc2() { return Array[0]; };  // error: 'Array' was not
> declared in this scope

Ändere das in:

   int     fc2() { return this->Array[0]; };

> Der gleiche Code kompiliert unter Borland CBuilder, Microsoft visual
> studio 6 und einem anderen embedded compiler von microtec.

Er ist falsch und sollte eigentlich nicht akzeptiert werden. GCC verhält 
sich hier korrekt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.