Jest jedno zastosowanie, o którym jeszcze nie wspomniano w C ++, i które nie ma na celu odwoływania się do własnego obiektu ani ujednoznaczniania członka z otrzymanej zmiennej.
Można użyć this
do przekształcenia nieuzależnionej nazwy na nazwę zależną od argumentu w klasach szablonów, które dziedziczą z innych szablonów.
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
}
}
Szablony są kompilowane za pomocą mechanizmu dwuprzebiegowego. Podczas pierwszego przejścia rozpoznawane i sprawdzane są tylko nazwy nie-zależne od argumentów, podczas gdy nazwy zależne są sprawdzane tylko pod kątem spójności, bez faktycznego zastępowania argumentów szablonu.
Na tym etapie, bez faktycznego podstawiania typu, kompilator nie ma prawie żadnych informacji o tym, co base<T>
mogłoby być (zauważ, że specjalizacja szablonu podstawowego może przekształcić go w zupełnie inne typy, nawet typy nieokreślone), więc po prostu zakłada, że jest to typ . Na tym etapie niezależne wywołanie, f
które wydaje się programiście naturalne, jest symbolem, który kompilator musi znaleźć jako element derived
lub w przestrzeniach nazw - co nie zdarza się w tym przykładzie - i narzeka.
Rozwiązaniem jest przekształcenie nazwy f
niezależnej w nazwę zależną. Można to zrobić na kilka sposobów, jednoznacznie wskazując typ, w którym jest on zaimplementowany (- base<T>::f
dodanie base<T>
powoduje, że symbol jest zależny, T
a kompilator po prostu przyjmie, że istnieje, i opóźni faktyczne sprawdzenie drugiego przejścia, po podstawianie argumentów.
Drugim sposobem, dużo sortującym, jeśli dziedziczysz po szablonach, które mają więcej niż jeden argument lub długie nazwy, jest po prostu dodanie this->
przed symbolem. Ponieważ implementowana klasa szablonów zależy od argumentu (dziedziczy po base<T>
) this->
jest zależna od argumentu i otrzymujemy ten sam wynik: this->f
jest sprawdzany w drugiej rundzie, po podstawieniu parametru szablonu.
this
w MSDN. Podążaj za tym linkiem ... ;-)