Há um uso que ainda não foi mencionado em C ++ e que não é para se referir ao próprio objeto ou desambiguar um membro de uma variável recebida.
Você pode usar this
para converter um nome não dependente em um nome dependente de argumento dentro de classes de modelo que herdam de outros modelos.
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
}
}
Os modelos são compilados com um mecanismo de duas passagens. Durante a primeira passagem, apenas nomes dependentes de não argumento são resolvidos e verificados, enquanto nomes dependentes são verificados apenas por coerência, sem realmente substituir os argumentos do modelo.
Nessa etapa, sem realmente substituir o tipo, o compilador quase não tem informações do que base<T>
poderia ser (observe que a especialização do modelo base pode transformá-lo em tipos completamente diferentes, mesmo tipos indefinidos); portanto, apenas assume que é um tipo . Nesse estágio, a chamada não dependente f
que parece natural ao programador é um símbolo que o compilador deve encontrar como membro dederived
ou nos espaços de nomes anexos - o que não acontece no exemplo - e ele irá reclamar.
A solução está transformando o nome não dependente f
em um nome dependente. Isso pode ser feito de duas maneiras, declarando explicitamente o tipo em que é implementado (- base<T>::f
adicionando o base<T>
torna o símbolo dependente T
e o compilador apenas assume que ele existirá e adia a verificação real para a segunda passagem, depois substituição de argumento.
A segunda maneira, muito mais ordenada, se você herdar de modelos com mais de um argumento ou nomes longos, é apenas adicionar um this->
antes do símbolo. Como a classe de modelo que você está implementando depende de um argumento (herdado de base<T>
) this->
depende do argumento, e obtemos o mesmo resultado: this->f
é verificado na segunda rodada, após a substituição dos parâmetros do modelo.
this
no MSDN. Por favor, siga este link ... ;-)