Есть одно использование, которое еще не было упомянуто в C ++, и это не для ссылки на собственный объект или устранения неоднозначности члена из полученной переменной.
Вы можете использовать thisдля преобразования независимого имени в зависимое от аргумента имя внутри шаблонных классов, которые наследуются от других шаблонов.
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
}
}
Шаблоны компилируются с помощью двухпроходного механизма. Во время первого прохода разрешаются и проверяются только не зависящие от аргумента имена, в то время как зависимые имена проверяются только на согласованность без фактической замены аргументов шаблона.
На этом шаге, фактически не заменяя тип, компилятор почти не имеет информации о том, что base<T>может быть (обратите внимание, что специализация базового шаблона может превратить его в совершенно разные типы, даже неопределенные типы), поэтому он просто предполагает, что это тип , На этом этапе независимый вызов, fкоторый кажется программисту естественным, является символом, который компилятор должен найти в качестве членаderived или во вложенных пространствах имен - чего не происходит в примере - и он будет жаловаться.
Решение превращает независимое имя fв зависимое имя. Это можно сделать несколькими способами, явно указав тип, в котором он реализован (- base<T>::fдобавление base<T>символа делает символ зависимым, Tи компилятор просто предположит, что он будет существовать, и откладывает фактическую проверку для второго прохода после подстановка аргументов.
Второй способ, намного более сортирующий, если вы наследуете от шаблонов, имеющих более одного аргумента или длинных имен, - это просто добавление this->перед символом. Поскольку класс шаблона, который вы реализуете, зависит от аргумента (он наследует base<T>), this->он зависит от аргумента, и мы получаем тот же результат: this->fпроверяется во втором раунде после подстановки параметра шаблона.
thisна MSDN. Пожалуйста, перейдите по этой ссылке ... ;-)