2009-11-07 15 views
8

Ho un semplice contenitore:Modelli e classi annidate/strutture

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

    //... 
}; 

Ora, c'è una funzione chiamata _search che cerca la lista e restituisce un riferimento al nodo che ha trovato. Ora, quando mi riferisco al tipo di ritorno della funzione, penso che dovrebbe essere list<nodeType>::node*. È giusto? Quando ho definire la funzione inline, funziona perfettamente:

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

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

Ma, se io definisco la funzione di fuori della classe,

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

non funziona. Il compilatore dà un errore dicendo Expected constructor before list<nodeType>::_search o qualcosa del genere. L'errore è qualcosa di simile a questo. Non ho una macchina su cui posso testarlo al momento.

Qualsiasi aiuto è sinceramente apprezzato.

risposta

21

perché il node è un tipo dipendente. Hai bisogno di scrivere la firma come segue (nota che ho spezzato in 2 righe per chiarezza)

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

Nota l'uso della parola chiave typename.

+1

Più, molto geek, i dettagli possono essere trovati nel C++ FAQ Lite: http://www.parashift.com/c++-faq-lite/templates.html#faq-35.18 –

+0

grazie mille per l'aiuto .. funziona perfettamente ora. grazie ancora .. –

+0

Link aggiornato per le FAQ: https://isocpp.org/wiki/faq/templates#dependent-name-lookup-types – Ashe

6

È necessario dire al compilatore che node è un tipo utilizzando la parola chiave typename Altrimenti penserà nodo come una variabile static in class list. Aggiungi typename ogni volta che utilizzi il nodo come tipo nella tua implementazione della lista.

Problemi correlati