Pregunta

Tengo una antigua base de código aquí, donde usaban variables miembro protegidas. Se puede discutir si esta es una buena idea o no. Sin embargo, el código debe haberse compilado bien con gcc3. Tengo una barra de clase de plantilla derivada que usa miembro protegido x de la plantilla de clase Foo así

template <class Something> class Foo {  
public:  
// stuff...  
protected:  
  some::type x;  
}

template <class Something> Bar : Foo<Something> {
public:
  void cleanup();
}

Y en el método de declaración de limpieza () hay algo hecho con x

template <class Something> void Bar<Something>::cleanup() {
  doSomeThingCleanUpLike (x);
}

Esto no funciona con gcc4, aunque debería haber funcionado con gcc3. Funciona cuando lo cambio a

doSomeThingCleanUpLike (this->x);

¿Por qué es ese el caso?

¿Fue útil?

Solución

La expresión x utilizada en la clase derivada, según las reglas del estándar, no depende de ningún parámetro de plantilla de la clase derivada. Debido a esto, la búsqueda ocurre en el contexto de la definición de plantilla y no en el punto de uso / instanciación. Aunque la clase base de plantilla de la plantilla parece ser visible, debido a que es una clase de plantilla, la instanciación particular que podría usarse podría involucrar plantillas especializadas, por lo que la definición de plantilla de clase base no puede usarse para la búsqueda de nombres.

Al cambiar la expresión a this- > x , la está convirtiendo en una expresión dependiente ( this en una plantilla de clase siempre depende de los parámetros de la plantilla). Esto significa que la búsqueda ocurrirá en el contexto de instanciación, en ese momento la clase base es completamente conocida y sus miembros son visibles.

Otros consejos

Cuando define la plantilla derivada, el compilador solo conoce el nombre de la clase de plantilla base pero no sus detalles, por lo que el compilador no sabe que la clase derivada tiene un miembro heredado. Para decirle al compilador la existencia del miembro, use this- > , tal como lo hizo.

En realidad, es un duplicado de esta pregunta .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top