Vorlagenvererbung und Suche nach nicht abhängigen Namen verstehen
Bedenken Sie den folgenden Codeausschnitt:
<code class="cpp">// arrayListType.h template <class elemType> class arrayListType { protected: elemType *list; int length; }; // unorderedArrayListType.h template <class elemType> class unorderedArrayListType: public arrayListType<elemType> { }; // main1.cpp unorderedArrayListType<int> intList(25);</code>
Kompilieren Sie dies Code führt zu einem Fehler: „Länge wurde in diesem Bereich nicht deklariert“, was darauf hinweist, dass die geschützten Variablen der übergeordneten Klasse, arrayListType, in der geerbten Klasse, unorderedArrayListType, nicht sichtbar sind.
Dies ist auf ein Konzept zurückzuführen Dies wird als Suche nach nicht abhängigen Namen bezeichnet und definiert, wie der Compiler Verweise auf nicht abhängige Namen in Vorlagen auflöst. Nicht abhängige Namen sind solche, die nicht von den Vorlagenparametern abhängen, wie z. B. Mitgliedsvariablen oder Mitgliedsfunktionsnamen.
In diesem Fall sind die geschützten Variablen in arrayListType nicht abhängige Namen, und zwar nicht explizit definiert in der Klassendefinition unorderedArrayListType. Der Compiler kann nicht feststellen, dass diese Namen in der geerbten Klasse vorhanden sind, und meldet daher einen Fehler.
Beheben des Fehlers
Es gibt zwei gängige Ansätze, um diesen Fehler zu beheben:
Verwenden Sie dies-> Präfix:
Nicht abhängigen Namen wird dieses Präfix vorangestellt-> gibt explizit an, dass sie sich auf geerbte Mitglieder beziehen:
<code class="cpp">class unorderedArrayListType: public arrayListType<elemType> { public: void insertAt(int location, const elemType& insertItem) { this->length++; this->list[location] = insertItem; } };</code>
Verwendung von Deklarationen:
Die Verwendung von Deklarationen deklariert explizit die nicht abhängigen Namen innerhalb der geerbten Klasse:
<code class="cpp">class unorderedArrayListType: public arrayListType<elemType> { public: using arrayListType<elemType>::list; using arrayListType<elemType>::length; void insertAt(int location, const elemType& insertItem) { length++; list[location] = insertItem; } };</code>
Beide Methoden teilen dem Compiler effektiv mit, dass die nicht abhängigen Namen zur geerbten Klasse gehören, und ermöglichen den erfolgreichen Fortgang der Kompilierung.
Das obige ist der detaillierte Inhalt vonWarum kann ich in einer von einer Vorlage abgeleiteten Klasse nicht auf geschützte Mitglieder meiner Basisklasse zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!