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?

War es hilfreich?

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 .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top