Wenn in C eine abgeleitete Template-Klasse von einer Basis-Template-Klasse erbt, ist es natürlich, die abgeleitete Klasse zu erwarten um Zugriff auf die Bezeichner der Basisklasse zu haben. In bestimmten Szenarien kann es jedoch vorkommen, dass dieser Zugriff eingeschränkt ist.
Beachten Sie den folgenden Code:
template <typename T> class Base { public: static const bool ZEROFILL = true; static const bool NO_ZEROFILL = false; }; template <typename T> class Derived : public Base<T> { public: Derived( bool initZero = NO_ZEROFILL ); // NO_ZEROFILL is not visible ~Derived(); };
In diesem Beispiel kann die abgeleitete Klasse nicht auf den definierten Bezeichner NO_ZEROFILL zugreifen in der Basisklasse. Dieses Verhalten wird durch den zweiphasigen Suchmechanismus in C verursacht.
Während der Vorlagenerweiterung wird die Basisklassenvorlage mit einem bestimmten Typ für T instanziiert. In diesem Fall kennt der Compiler den tatsächlichen Typ von nicht T, bis die Vorlage verwendet wird. Daher können Bezeichner in der Basisklasse, die von T abhängen, wie z. B. NO_ZEROFILL, nicht aufgelöst werden.
Um dieses Problem zu beheben, müssen Sie die Basisklassenvorlage beim Zugriff auf deren Bezeichner explizit angeben. Beispielsweise müssten Sie Derived
Diese explizite Basisklassenvorlagenspezifikation weist den Compiler an, im Kontext des Derived
Das obige ist der detaillierte Inhalt vonWarum können abgeleitete Vorlagenklassen nicht auf Basis-Vorlagenklassen-IDs zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!