C'è un uso che non è già stato menzionato in C ++ e che non è fare riferimento al proprio oggetto o disambiguare un membro da una variabile ricevuta.
È possibile utilizzare this
per convertire un nome non dipendente in un nome dipendente dall'argomento all'interno delle classi di modelli che ereditano da altri modelli.
template <typename T>
struct base {
void f() {}
};
template <typename T>
struct derived : public base<T>
{
void test() {
//f(); // [1] error
base<T>::f(); // quite verbose if there is more than one argument, but valid
this->f(); // f is now an argument dependent symbol
}
}
I modelli sono compilati con un meccanismo a due passaggi. Durante il primo passaggio, vengono risolti e controllati solo i nomi dipendenti senza argomento, mentre i nomi dipendenti vengono controllati solo per coerenza, senza sostituire effettivamente gli argomenti del modello.
A quel punto, senza sostituire effettivamente il tipo, il compilatore non ha quasi alcuna informazione su ciò che base<T>
potrebbe essere (si noti che la specializzazione del modello di base può trasformarlo in tipi completamente diversi, anche tipi non definiti), quindi presuppone solo che sia un tipo . In questa fase la chiamata non dipendente f
che sembra naturale al programmatore è un simbolo che il compilatore deve trovare come membro derived
o racchiudendo spazi dei nomi - cosa che non accade nell'esempio - e si lamenterà.
La soluzione sta trasformando il nome non dipendente f
in un nome dipendente. Questo può essere fatto in un paio di modi, affermando esplicitamente il tipo in cui è implementato ( base<T>::f
--addizionando base<T>
il simbolo dipende dal simbolo T
e il compilatore supporrà semplicemente che esisterà e rimanderà il controllo effettivo per il secondo passaggio, dopo sostituzione argomento.
Il secondo modo, molto più interessante se erediti da modelli che hanno più di un argomento o nomi lunghi, è semplicemente aggiungere un this->
simbolo prima. Poiché la classe modello che stai implementando dipende da un argomento (eredita da base<T>
) this->
dipende dall'argomento e otteniamo lo stesso risultato: this->f
viene verificato nel secondo round, dopo la sostituzione dei parametri del modello.
this
di MSDN. Segui questo link ... ;-)