Hay dos fases en instancias de plantilla ("Fase Dos de búsqueda de nombres").
En la primera fase, todos los nombres no dependientes se resuelven (se busca). En la segunda fase, los nombres dependientes se resuelven.
Un nombre dependiente es un nombre que depende de un parámetro de plantilla, por ejemplo .:
template <typename T>
void foo() {
x = 0; // <- Non-dependent, nothing in that refers to "T".
// Thus looked up in phase 1, therefore, an 'x' must be
// visible.
T::x = 0; // <- Dependent, because it depends on "T".
// Looked up in phase 2, which is when it must be visible.
}
Ahora, se escribe:
t = this->a; //Okay
t = a //Error
Esto es exactamente lo que he descrito. En el término correcto, t
se busca en la fase 2, porque this
depende de un parámetro de plantilla.
El término erróneo se busca en la fase 1, porque nada en ese nombre depende de un parámetro de plantilla. Pero en la fase 1, no a
es visible, porque el compilador no puede introspeccionar las plantillas de clase base en la fase 1, porque las plantillas pueden especializarse y en el momento de instanciación, que pueden ser remotas de la declaración de plantilla primaria, otra especialización que no tiene a
, puede ser visible.
Ejemplo:
template <typename T>
struct Base {
};
template <typename T>
struct Derived : Base<T> {
void foo() {
this->a = 0; // As is valid. `this->a` is looked up in phase 2.
}
};
template <> struct Base<int> {
int a;
};
int main()
{
// The following declarations trigger phase 2 lookup.
Derived<int> di; // valid, because a later specialized
// Base<int> is used and all symbols
// are resolved.
Derived<float> df; // not valid
}
Por cierto, una vez que he escrito this-> is not only a matter of style en mi blog muy baja frecuencia.
Joachim Pileborg le dio la respuesta. Además de eso, el código proporcionado tiene otros problemas que le impiden compilar. – Anonymous
¿Es este el código real?No hay puntos y coma al final después de las definiciones de clase y el operador de ámbito para 'int B: f()' es incorrecto más no hay punto y coma en la línea de error. –
hmjd
oh, es solo un error de tipeo. Lo arreglé. –