PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Vererbung bei inneren Klassen in einem Template


chetigol
2012-06-19, 17:36:34
Hi,
habe eine Frage zu folgendem Beispiel:


template < class C >
class Super
{
private:
class A
{
public:
int a;
};

class B : public A
{
public:
B()
{
a = 5;
};
};
};



Mein Problem ist die Zuweisung a = 5 in der abgeleiteten inneren Klasse B.

Ich bekomme folgenden Comilerfehler:

In constructor 'Super<C>::B::B()'
error: 'a' was not declared in this scope


greif ich aber über die Klasse A drauf zu (A::a), dann funktioniert es.

Kann mir jemand den Grund dafür sagen, wieso sich hier der Compiler aufregt?

Lass ich das template weg, dann funktioniert es problemlos. Als Template muss ich aber über A::a auf die variable zugreifen.

Tiamat
2012-06-19, 19:41:28
this->a sollte genügen. Deine Template Klasse wird nirgendwo benutzt, Absicht oder folgt das noch ?

Gnafoo
2012-06-19, 22:59:39
Das hatte ich vor kurzem auch schon einmal. Man muss den Namen voll qualifizieren oder this verwenden.

Siehe (da wird auch der Standard zitiert):
http://stackoverflow.com/questions/4870739/nested-class-inheritance

chetigol
2012-06-20, 06:30:21
@Tiamat
Wird schon benutzt, aber unabhängig davon tritt der Fehler auf

Ok, danke euch. Wie schon geschrieben hab ich es über die volle qualifizierung gelöst (A::a), dass es aber über:


this->a


auch funktioniert, darauf wär ich nicht gekommen.

Habe schon gedacht, dass des sich um einen Compilerfehler handelt (gcc), da es unter VC funktioniert.

Danke jedefalls!

Gast
2012-07-02, 16:07:28
Habe schon gedacht, dass des sich um einen Compilerfehler handelt (gcc), da es unter VC funktioniert.In uralten GCCs (bis 3.3) hat das auch mal funktioniert. Wurde dann aber durch eine korrekte Implementierung ersetzt.

Die GCC-Doku beschreibt diesen Fall auch recht gut:
http://gcc.gnu.org/onlinedocs/gcc/Name-lookup.html

Würde mich mal interessieren, welche VC-Version du verwendest. Ist das was halbwegs aktuelles?