2009-11-27 9 views
8

Estoy tratando de crear un objeto de lista, con la clase de iterador anidada dentro para comprender cómo funciona. En algún método, estoy tratando de devolver un objeto iterador pero no funciona. creé un ejemplo para demostrar el problema:C++ devolviendo clase anidada con la plantilla en el problema de clase base

// CLASS A 
template <class T> 
class A 
{ 
    public: 
     class B; 
     A(){} 
}; 

// CLASS B 
template <class T> 
class A<T>::B 
{ 
    private: 
     int varB; 

    public: 
     B(B& b); 
     B(const int&); 
     B returnThis(); 
}; 

template <class T> 
A<T>::B::B(const int& value) 
{ 
    varB = value; 
} 

template <class T> 
A<T>::B::B(B& b) 
{ 
    varB = b.varB; 
} 

template <class T> 
A<T>::B A<T>::B::returnThis() 
{ 
    return *this; 
} 

// MAIN 

void main() 
{ 
    A<int>::B classB(10); 
} 

El error está cerca de esas líneas:

template <class T> 
A<T>::B A<T>::B::returnThis() 

El compilador me dice que me falta una; antes A :: B :: returnThis()

Estoy tratando de resolver este problema por días y no puedo encontrar la manera de hacerlo funcionar ... Realmente agradecería algo de ayuda. ¡Gracias de antemano!

Respuesta

13

Usted necesita typename:

typename A<T>::B 

Para indicar al compilador que A<T>::B es un tipo. Aquí hay un good explanation por qué.

Lo que B es depende de lo que A<T> es, esto se llama dependencia. Cada vez que obtiene un tipo de una clase o estructura, y depende de una plantilla, deberá usar typename.

+0

¡Muchas gracias! Voy a tener un look @ typename! –

+0

No hay problema. :) – GManNickG

Cuestiones relacionadas