2010-06-06 14 views
5

Estoy tratando de entender whay me sale un error en el código: (el error es menor de g ++ Unix compilador VS está recopilando OK.)problema con la herencia de plantillas

template<class T> class A { 
public: 
    T t; 
public: 
    A(const T& t1) : t(t1) {} 
    virtual void Print() const { cout<<*this<<endl;} 
    friend ostream& operator<<(ostream& out, const A<T>& a) { 
      out<<"I'm "<<typeid(a).name()<<endl; 
      out<<"I hold "<<typeid(a.t).name()<<endl; 
      out<<"The inner value is: "<<a.t<<endl; 
      return out; 
    } 
}; 

template<class T> class B : public A<T> { 
public: 
    B(const T& t1) : A<T>(t1) {} 
    const T& get() const { return t; } 
}; 

int main() { 
    A<int> a(9); 
    a.Print(); 
    B<A<int> > b(a); 
    b.Print(); 
    (b.get()).Print(); 
    return 0; 
} 

Este código está dando el siguiente de error:

main.cpp: en función miembro const T & B :: get() const ':
main.cpp: 23: error: 't' no estaba declarado en este ámbito

se compilado cuando yo cambiado el código de B a esto:

template<class T> class B : public A<T> { 
public: 
    B(const T& t1) : A<T>(t1) {} 
    const T& get() const { return A<T>::t; } 
}; 

simplemente no puedo entender lo que es el problema con el primer código ...
No tiene sentido que realmente necesito para escribir "A ::" cada time ...

Respuesta

7

También puede usar this->t para acceder al miembro de la plantilla de la clase base.

En B::get(), el nombre t no depende del parámetro de plantilla T, por lo que no es un nombre dependiente. La clase base A<T> es obviamente dependiente del parámetro de plantilla T y, por lo tanto, es una clase base dependiente. Los nombres no dependientes no se buscan en clases base dependientes. A detailed description of why this is the case can be found in the C++ FAQ Lite.

+2

La pregunta frecuente es incorrecta sobre el motivo por el que funciona "this->". Compáralo con el estándar (enfatiza por mí). Preguntas frecuentes: "Dado que esto siempre depende implícitamente en una plantilla, this-> f * es dependiente y la búsqueda por lo tanto se aplaza * hasta que la plantilla se instancia realmente, * en cuyo punto todas las clases base se consideran *", Estándar: ". .. el alcance de la clase base * no se examina * durante la búsqueda de nombres no calificados en el punto de definición de la plantilla de clase o miembro * o durante una instanciación * de la plantilla de clase o miembro. ". La pregunta frecuente dice que se ha encontrado porque es dependiente, pero eso está mal. –

+1

GCC también implementa esta interpretación incorrecta, y como resultado [tiene informes de errores abiertos] (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43282) –

Cuestiones relacionadas