2009-10-26 17 views
9

Ich habe eine alte Codebasis hier, wo sie geschützte Member Variablen verwendet. Ob das eine gute Idee ist oder nicht, kann diskutiert werden. Der Code muss jedoch ordnungsgemäß mit gcc3 kompiliert worden sein. Ich habe eine Template-Klasse Bar abgeleitet, dieZugriff geschütztes Mitglied einer Klasse in einer abgeleiteten Klasse

template <class Something> class Foo { 
public: 
// stuff... 
protected: 
    some::type x; 
} 

template <class Something> Bar : Foo<Something> { 
public: 
    void cleanup(); 
} 

Und in der Methodendeklaration von Bereinigungs wie so Mitglied x von Klassenvorlage Foo geschützt() verwendet, es ist etwas mit x

template <class Something> void Bar<Something>::cleanup() { 
    doSomeThingCleanUpLike (x); 
} 

Nachdem dies geschehen ist, tut funktioniert nicht mit gcc4, obwohl es mit gcc3 funktioniert haben sollte. Es funktioniert, wenn ich es zu

doSomeThingCleanUpLike (this->x); 

ändern Warum ist das der Fall?

+1

Der Begriff "Vorlagenklasse" ist oft die Quelle der Verwirrung. Der korrekte Begriff ist "Klassenvorlage", weil die Sache eine Vorlage für Klassen ist. Es ist keine Klasse. Ich würde Ihre Frage bearbeiten, aber es ist möglicherweise einer der Gründe, warum Sie verwirrt wurden. – MSalters

+1

Ihre Funktionsdefinition von "Bereinigung" ist nicht konform. Fehlende Rückgabetypen und Vorlagensegmente für "Bar". Sicher, so ist es in deinem Code? –

+0

Danke litb. Ich habe es geändert. Koffeingehalt war nicht hoch genug, um es zu erkennen. Auch in "Klassenvorlage" geändert. Ob die Vorlagenklasse oder Klassenvorlage das Problem nicht beeinflusst. Der Begriff wird nur informell verwendet. – GeeF

Antwort

13

Der in der abgeleiteten Klasse verwendete Ausdruck x ist nach den Regeln im Standard nicht von einem Vorlagenparameter der abgeleiteten Klasse abhängig. Aus diesem Grund findet die Suche im Kontext der Vorlagendefinition und nicht am Verwendungsort/Instanziierung statt. Obwohl die Vorlagen-Basisklasse der Vorlage sichtbar zu sein scheint, da es sich um eine Vorlagenklasse handelt, kann die bestimmte Instanziierung, die verwendet wird, spezialisierte Vorlagen enthalten, sodass die Basisklassen-Vorlagendefinition nicht für die Namenssuche verwendet werden kann.

Indem Sie den Ausdruck in this->x ändern, machen Sie einen abhängigen Ausdruck (this in einer Klassenvorlage hängt immer von den Vorlagenparametern ab). Dies bedeutet, dass die Suche im Instanziierungskontext erfolgt, an dem die Basisklasse vollständig bekannt ist und ihre Mitglieder sichtbar sind.

+0

+1 auf den richtigen Begriff: * abhängige */* nicht-abhängige * Namen. –

6

Wenn Sie die abgeleitete Vorlage definieren, kennt der Compiler nur den Namen der Basisvorlagenklasse, nicht jedoch deren Details. Daher weiß der Compiler nicht, dass die abgeleitete Klasse über ein geerbtes Element verfügt. Um dem Compiler die Existenz des Mitglieds mitzuteilen, verwenden Sie this->, genau wie Sie.

Eigentlich ist es ein Duplikat von this question.

+1

Es ist wichtig zu beachten, dass das Hinzufügen von this-> 'kein Ritual ist, sondern eine Möglichkeit, einen nicht abhängigen Namen in einen abhängigen umzuwandeln. Siehe Antwort von Charles. –

+0

Guter Fang, diese Frage _hat_ einen schlechten Titel. Jetzt behoben. – MSalters

Verwandte Themen