2011-02-07 16 views
7

duplicados posibles:
[FAQ]Why doesn't a derived template class have access to a base template class' identifiers? Problem with protected fields in base class in c++
cannot access data member in a class templateclase de C++ plantilla y de herencia

siguiente código me da error de compilación. ¿Qué está mal?

struct Base { 
    int amount; 
}; 

template<class T> struct D1 : public Base { 
}; 

template<class T> 
struct D2 : D1<T> { 
    void foo() { amount=amount*2; /* I am trying to access base class data member */ }; 
}; 

int main() { 
    D2<int> data; 
}; 


test.cpp: In member function 'void D2<T>::foo()': 
test.cpp:11: error: 'amount' was not declared in this scope 

¿Cómo corregir esto?

gracias

+0

He visto esta pregunta varias veces pero no puedo encontrar un enlace. –

+0

Encontré uno, aunque si alguien puede encontrar uno con una pregunta mejor que sería genial: [Problema con los campos protegidos en la clase base en C++] (http://stackoverflow.com/questions/1813671/problem-with-protected- fields-in-base-class-in-c) –

+2

@Chris: Aquí hay un [duplicado] (http://stackoverflow.com/questions/4210108/cannot-access-data-member-in-alassiculation) , y aquí hay una [explicación larga] (http://stackoverflow.com/questions/4643074/why-do-i-have-to-access-template-base-class-members-through-the-this-pointer). – GManNickG

Respuesta

8

El problema en este caso tiene que ver con cómo los nombres se buscan en las clases de plantilla que heredan de las clases base plantilla. Las verdaderas reglas detrás de esto son bastante arcanas y no las conozco de manera excepcional; Normalmente tengo que consultar una referencia para saber exactamente por qué esto no funciona.

La manera de solucionar este problema es el prefijo de manera explícita el miembro que está accediendo con this->:

void foo() { 
    this->amount = this->amount * 2; // Or: this->amount *= 2; 
} 

Esto le da al compilador de una pista inequívoca acerca de donde el nombre proviene de amount y debe resolver el error del compilador.

Si alguien quiere dar una descripción más detallada de por qué ocurre este error, me gustaría ver una buena explicación.

+1

El motivo del error es que el compilador no hace suposiciones sobre los miembros de la clase base de la plantilla en caso de que exista una especialización parcial de la clase base que no incluya algunos de estos miembros. – Gorpik

+0

Gracias. ¡Funciona! – anon

+0

De acuerdo con [este] (http://www.hackcraft.net/cpp/templateInheritance/): "Una cosa interesante a tener en cuenta sobre la base es que ninguna de sus funciones miembro se crea hasta después del tipo T". Por lo tanto, es posible que el compilador no sepa en tiempo de definición sobre ninguno de los miembros, ni solo sobre las funciones. – jswolf19