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ì?

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top