2010-07-19 13 views
8

posibles duplicados:
GCC problem : using a member of a base class that depends on a template argument
Why does GCC need extra declarations in templates when VS does not?
Why doesn’t a derived template class have access to a base template class
iphone compiler inherited templated base classes with passed through type not being expanded in time (just look)C++ clase de plantilla heredar otra clase de plantilla con un tipo de entrada de plantilla-especificado

Lo sentimos por el título confuso, lo mejor que se me ocurre.

Aquí hay algo de código para ilustrar mi problema ...

Una clase de plantilla base:

template<class T> class TestBase 
{ 
public: 
    int someInt; 
}; 


El intento de subclase TestBase con otra clase de plantilla ...

Esto obtiene "someInt no fue declarado en este ámbito" en el momento de la compilación:

template<class X> class TestSub : public TestBase<X> 
{ 
    void testf() 
    { 
     someInt = 0; //Error: "someInt was not declared in this scope" 
    } 
}; 



B) Esto funciona bien (la diferencia de que yo indique entrada de la plantilla de TestBase explícitamente)

template<class X> class TestSub : public TestBase<string> 
{ 
    void testf() 
    { 
     someInt = 0; 
    } 
}; 



¿Por qué TestSub a partir de (A) no heredarán someInt correctamente como lo hace en (B)?

Gracias de antemano.

+1

Cerrado como una estafa de http://stackoverflow.com/questions/11405/gcc-problem-using-a-member-of-a-base-class-that-depends-on-a-template-argument y http://stackoverflow.com/questions/1643035/typedef-in-template-base-class y http://stackoverflow.com/questions/1239908/why-doesnt-a-derived-template-class-have-access- to-a-base-template-class y http://stackoverflow.com/questions/2812470/why-does-gcc-need-extra-declarations-in-templates-when-vs-does-not y varios más –

Respuesta

7

Porque TestBase podría estar especializado en X, sea lo que sea que termine X. Por lo tanto, debe dejar que la compilación sepa algo. Es un valor dependiente al calificarlo completamente. En lugar de

 someInt = 0 

dicen en lugar

 TestBase<X>::someInt = 0 

Usted podría también utilizar

 this->someInt = 0 

El punto es que el compilador no asumirá un nombre depende de un parámetro de plantilla que debe saber es antes de que difiera ese control al tiempo de creación de instancias. Para un experimento, vea qué sucede cuando introduce un elemento global.

+1

O en lugar de la cualificación completa, simplemente use 'this-> someInt'. –

+0

Sí, acabo de agregar eso. –

+1

Tenga en cuenta que la búsqueda diferida hasta la creación de instancias no es suficiente. El estándar explícitamente dice que incluso en el momento de instanciación, los nombres no calificados no se buscan en las clases base dependientes durante la búsqueda no calificada. Resulta que funciona para 'this-> someInt' y otros porque no hacen una búsqueda no calificada. Este detalle a menudo se pasa por alto al razonar al respecto, pero es importante. –

Cuestiones relacionadas