2009-11-07 11 views
8

Mam proste opakowania:Szablony i zagnieżdżone klasy/struktury

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

    //... 
}; 

Teraz jest funkcja o nazwie _search który przeszukuje listę i zwraca referencję do węzła, który dopasowane. Teraz, kiedy mówię o zwracaniu typu funkcji, myślę, że powinno to być list<nodeType>::node*. Czy to jest poprawne? Kiedy zdefiniowania funkcji inline, działa perfekcyjnie:

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

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

Ale gdybym zdefiniować funkcję poza klasą,

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

to nie działa. Kompilator podaje komunikat o błędzie mówiąc: Expected constructor before list<nodeType>::_search lub coś podobnego. Błąd jest podobny do tego. Nie mam maszyny, na której mogę ją przetestować.

Każda pomoc jest szczerze doceniana.

Odpowiedz

21

to dlatego, że node jest typem zależnym. Musisz napisać podpis następująco (zauważ, że złamałem ją na 2 linie dla jasności)

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

Zauważ użycie słowa kluczowego typename.

+1

Więcej, bardzo geeky, szczegóły można znaleźć w C++ FAQ Lite: http://www.parashift.com/c++-faq-lite/templates.html#faq-35.18 –

+0

wielkie dzięki za pomoc .. teraz działa idealnie. Jeszcze raz dziękuję .. –

+0

Zaktualizowany link do FAQ: https://isocpp.org/wiki/faq/templates#dependent-name-lookup-tites – Ashe

6

Musisz poinformować kompilator, że node jest rodzajem za pomocą słowa kluczowego typename .Otherwise będzie myśleć węzeł jako static zmiennej w class list. Dodaj typename za każdym razem, gdy używasz węzła jako typu w implementacji listy.