2010-05-15 12 views
7

¿Por qué este código no es válido?Plantilla C++: 'no se deriva del tipo'

#include <vector> 

template <typename T> 
class A { 
    public: 
    A() { v.clear(); } 

    std::vector<A<T> *>::const_iterator begin() { 
     return v.begin(); 
    } 

    private: 
    std::vector<A<T> *> v; 
}; 

GCC informa de los siguientes errores:

test.cpp:8: error: type 'std::vector<A<T>*, std::allocator<A<T>*> >' is not derived from type 'A<T>' 
test.cpp:8: error: expected ';' before 'begin' 
test.cpp:12: error: expected `;' before 'private' 

lo que está mal? ¿Como arreglarlo?

Respuesta

14

En esta línea, se echa en falta la typename palabra clave:

std::vector<A<T> *>::const_iterator begin(){ 

Es necesario:

typename std::vector<A<T> *>::const_iterator begin(){ 

Esto porque std::vector<A<T> *> depende del parámetro de plantilla (T) de la plantilla de clase (A) Para permitir el análisis correcto de la plantilla sin tener que hacer suposiciones sobre posibles especializaciones de otras plantillas, las reglas de lenguaje requieren que indique qué nombres dependientes denotan tipos usando la palabra clave typename.

3

Debe agregar typename, ya que los tipos dependen el uno del otro y el compilador no puede determinar si realmente es un tipo.

Sin embargo, el gcc 4.5.0 me sale un mensaje de error más concisa:

test.cc:8:3: error: need ‘typename’ before ‘std::vector<A<T>*>::const_iterator’ because ‘std::vector<A<T>*>’ is a dependent scope

Cuestiones relacionadas