Есть одно использование, которое еще не было упомянуто в 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. Пожалуйста, перейдите по этой ссылке ... ;-)