Hay un uso que aún no se ha mencionado en C ++, y que no se refiere al propio objeto o desambigua un miembro de una variable recibida.
Puede usar this
para convertir un nombre no dependiente en un nombre dependiente de argumento dentro de las clases de plantilla que heredan de otras plantillas.
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
}
}
Las plantillas se compilan con un mecanismo de dos pasos. Durante el primer paso, solo se resuelven y verifican los nombres dependientes que no son argumentos, mientras que los nombres dependientes se verifican solo por coherencia, sin sustituir realmente los argumentos de plantilla.
En ese paso, sin sustituir realmente el tipo, el compilador casi no tiene información de lo que base<T>
podría ser (tenga en cuenta que la especialización de la plantilla base puede convertirla en tipos completamente diferentes, incluso tipos indefinidos), por lo que simplemente asume que es un tipo . En esta etapa, la llamada no dependiente f
que parece natural para el programador es un símbolo que el compilador debe encontrar como miembro dederived
o en espacios de nombres adjuntos, lo que no ocurre en el ejemplo, y se quejará.
La solución es convertir el nombre no dependiente f
en un nombre dependiente. Esto se puede hacer de dos maneras, indicando explícitamente el tipo donde se implementa ( base<T>::f
agregando que base<T>
hace que el símbolo dependa T
y el compilador asumirá que existirá y pospondrá la verificación real para el segundo pase, después de sustitución de argumentos
La segunda forma, mucho clasificador si hereda de plantillas que tienen más de un argumento, o nombres largos, es simplemente agregar un this->
antes del símbolo. Como la clase de plantilla que está implementando depende de un argumento (hereda de base<T>
) this->
depende del argumento, y obtenemos el mismo resultado: this->f
se verifica en la segunda ronda, después de la sustitución del parámetro de plantilla.
this
en MSDN. Por favor, siga este enlace ... ;-)