2010-04-29 12 views
6

Estoy intentando utilizar variables miembro de una clase base de plantilla en una clase derivada, como en este ejemplo:Uso de variables miembro heredadas de una clase base de plantilla (C++)

template <class dtype> 
struct A { 
    int x; 
}; 

template <class dtype> 
struct B : public A<dtype> { 
    void test() { 
     int id1 = this->x;  // always works 
     int id2 = A<dtype>::x; // always works 
     int id3 = B::x;   // always works 
     int id4 = x;   // fails in gcc & clang, works in icc and xlc 
    } 
}; 

gcc y sonido metálico son ambos muy exigente con el uso de esta variable, y requieren un alcance explícito o el uso explícito de "esto". Con algunos otros compiladores (xlc y icc), las cosas funcionan como era de esperar. ¿Es este un caso de xlc y icc que permite código que no es estándar, o un error en gcc y clang?

+1

Pregunta similar: http://stackoverflow.com/questions/11405/gcc-problem-using-a-member-of-a-base-class-that-depends-on-a-template-argument –

Respuesta

5

Probablemente esté compilando en modo no estricto en icc. De todos modos, dado que x no está calificado, no se buscará en ninguna clase base que dependa de los parámetros de la plantilla. Por lo tanto, en su código, no hay ningún lugar donde se encuentre x y su código no es válido.

Los otros nombres se buscan utilizando otra forma de búsqueda (búsqueda de acceso de miembro de clase y búsqueda calificada). Ambas formas buscarán en las clases base dependientes si pueden (es decir, si son dependientes, y así se buscan al crear una instancia de la plantilla cuando se conoce dtype, todos los demás nombres dependen de los parámetros de la plantilla).

Incluso GCC en sus últimas versiones no implementa eso correctamente, y algunos nombres dependientes still resolve against dependent bases durante la búsqueda no calificada.

Cuestiones relacionadas