Zugriff auf geschützte member einer Klasse in einer abgeleiteten Klasse
-
06-07-2019 - |
Frage
ich habe eine alte Codebasis hier, wo Sie geschützte member-Variablen.Ob oder nicht, dies ist eine gute Idee kann diskutiert werden.Jedoch wird der code muss kompiliert gut mit gcc3.Ich habe eine abgeleitete Vorlage class Bar, nutzt geschützte member x aus Klasse Vorlage Foo wie so
template <class Something> class Foo {
public:
// stuff...
protected:
some::type x;
}
template <class Something> Bar : Foo<Something> {
public:
void cleanup();
}
Und in der Deklaration der Methode cleanup() gibt es etwas, das getan mit x
template <class Something> void Bar<Something>::cleanup() {
doSomeThingCleanUpLike (x);
}
Dies funktioniert nicht mit gcc4, obwohl es sollte arbeitete mit gcc3.Es funktioniert, wenn ich es zu ändern
doSomeThingCleanUpLike (this->x);
Warum ist das der Fall?
Lösung
Der Ausdruck x
verwendet in der abgeleiteten Klasse ist, durch die Regeln in der Norm nicht abhängig von template-parameter der abgeleiteten Klasse.Weil dieser, lookup geschieht im Rahmen der template-definition und nicht am point-of-use/Instanziierung.Obwohl die Vorlage Basisklasse der Vorlage angezeigt, um sichtbar zu werden, denn es ist eine template-Klasse, die bestimmte Instanziierung, die möglicherweise verwendet werden könnten, umfassen spezialisierte templates, so dass der Basis-Klasse Vorlage definition kann nicht verwendet werden für Namen-lookup.
Durch die änderung der Ausdruck this->x
Sie machen es einem abhängigen expression (this
eine Klasse template, hängt immer von der template-Parameter).Dies bedeutet, dass lookup auftreten, wird in der Instanziierung Kontext an die Stelle der base-Klasse ist vollständig bekannt und seine Mitglieder sichtbar.
Andere Tipps
Wenn Sie die abgeleitete Vorlage für die Definition, weiß der Compiler nur die Basis Template-Klasse Namen, aber nicht die Details, so Compiler nicht weiß, die abgeleitete Klasse ein vererbte Mitglied hat. Um den Compiler des Mitglieds Existenz zu sagen, verwenden this->
, genau wie du.
Eigentlich ist es ein Duplikat diese Frage .