Accedi al membro protetto di una classe in una classe derivata
-
06-07-2019 - |
Domanda
Ho una vecchia base di codice qui, dove hanno usato variabili membro protette. Si può discutere se questa sia una buona idea. Tuttavia, il codice deve essere stato compilato correttamente con gcc3. Ho una barra di classe modello derivata che utilizza il membro protetto x dal modello di classe Foo in questo modo
template <class Something> class Foo {
public:
// stuff...
protected:
some::type x;
}
template <class Something> Bar : Foo<Something> {
public:
void cleanup();
}
E nella dichiarazione del metodo di cleanup () c'è qualcosa fatto con x
template <class Something> void Bar<Something>::cleanup() {
doSomeThingCleanUpLike (x);
}
Questo non funziona con gcc4, anche se avrebbe dovuto funzionare con gcc3. Funziona quando lo cambio in
doSomeThingCleanUpLike (this->x);
Perché è così?
Soluzione
L'espressione x
utilizzata nella classe derivata non è, secondo le regole dello standard, non dipendente da alcun parametro template della classe derivata. Per questo motivo, la ricerca avviene nel contesto della definizione del modello e non nel punto di utilizzo / istanziazione. Anche se la classe base del modello del modello sembra essere visibile, poiché si tratta di una classe modello, la particolare istanza che potrebbe essere utilizzata potrebbe coinvolgere modelli specializzati, pertanto la definizione del modello della classe base non può essere utilizzata per la ricerca dei nomi.
Modificando l'espressione in this- > x
la rendi un'espressione dipendente ( this
in un modello di classe dipende sempre dai parametri del modello). Ciò significa che la ricerca verrà eseguita nel contesto dell'istanza in cui la classe base è completamente nota e i suoi membri sono visibili.
Altri suggerimenti
Quando si definisce il modello derivato, il compilatore conosce solo il nome della classe del modello di base ma non i suoi dettagli, quindi il compilatore non sa che la classe derivata ha un membro ereditato. Per dire al compilatore dell'esistenza del membro, usa this- >
, proprio come hai fatto tu.
In realtà, è un duplicato di questa domanda .