2009-11-07 29 views
8

I tienen un contenedor simple:Plantillas y clases/estructuras anidadas

template <class nodeType> list { 
    public: 
     struct node { 
      nodeType info; 
      node* next; 
     }; 

    //... 
}; 

Ahora, hay una función llamada _search que busca en la lista y devuelve una referencia al nodo que se correspondía. Ahora, cuando me refiero al tipo de devolución de la función, creo que debería ser list<nodeType>::node*. ¿Es esto correcto? Cuando defino la función en línea, funciona perfectamente:

template <class nodeType> list { 
    public: 
     struct node { 
      nodeType info; 
      node* next; 
     }; 

     node* _search { 
      node* temp; 
      // search for the node 
      return temp; 
     } 
}; 

Pero, si defino la función fuera de la clase,

template <class nodeType> list<nodeType>::node* list<nodeType>::_search() { 
    //function 
} 

no funciona. El compilador da un error al decir Expected constructor before list<nodeType>::_search o algo así. El error es algo similar a esto. No tengo una máquina en la que pueda probarlo actualmente.

Cualquier ayuda es sinceramente apreciada.

Respuesta

21

eso es porque node es un tipo dependiente. Usted tiene que escribir la firma de la siguiente manera (nota que he roto en 2 líneas para mayor claridad)

template <class nodeType> 
typename list<nodeType>::node* list<nodeType>::_search() 
{ 
    //function 
} 

Nota el uso de la palabra clave typename.

+1

Más, muy geek, los detalles se pueden encontrar en las preguntas más frecuentes de C++ Lite: http://www.parashift.com/c++faq-lite/templates.html#faq-35.18 –

+0

muchas gracias por la ayuda. funciona perfectamente ahora gracias de nuevo. –

+0

Enlace actualizado para las preguntas frecuentes: https://isocpp.org/wiki/faq/templates#dependent-name-lookup-types – Ashe

6

es necesario decirle al compilador que node es un tipo usando la palabra clave typename .otherwise pensar nodo como una variable static en class list. Agregue typename cada vez que utilice un nodo como tipo en su implementación de la lista.