2014-01-21 3 views
0

Для образовательных целей я пытаюсь реализовать что-то вроде std-контейнера. Но я застрял в объявлении функции шаблона. Нужна помощь с синтаксисомОбъект возврата шаблона в функции члена шаблона класса шаблона

Error: error C2039: 'Begin' : is not a member of 'SinglyLinkedList<T>'. 

заголовок:

template<class T> 
class SinglyLinkedList 
{ 
public: 
    typedef Iterator<T> Iterator; 

    SinglyLinkedList(); 
    SinglyLinkedList(const SinglyLinkedList & other); 
    ~SinglyLinkedList(); 

    bool IsEmpty() { return !m_pHead } 

    void PushFront(T data); 
    T & Front(); 
    void PopFront(); 
    void Clean(); 

    Iterator<T> Begin(); //Error 
// Iterator<T> End(); 
// Iterator<T> Delete(Iterator<T> it); 

private: 
    Node<T> * m_pHead; 
}; 

CPP файл:

template<class T> 
Iterator<T> SinglyLinkedList<T>::Begin() 
{ 

} 

EDIT:

typedef Iterator<T> Iterator; 

просто ЬурейеЕ так я могу используйте SinglyLinkedList :: Итератор для Итератора. У меня есть класс итератора/Это выглядит следующим образом:

template<class T> 
class Iterator 
{ 
    friend SinglyLinkedList<T>; 

public: 
    Iterator() : m_pLinkedList(0), m_pNode(0) {} 

    ~Iterator(){}; 

private: 
    Iterator(SinglyLinkedList<T> * pLinkedList, Node<T> * pNode) : m_pLinkedList(pLinkedList), m_pNode(pNode) {} 

    SinglyLinkedList<T> * GetListPtr() { return m_pLinkedList; } 
    Node<T> * GetNodePtr() { return m_pNode; } 

    void SetListPtr(SinglyLinkedList<T> * pList) { m_pLinkedList = pList; } 
    void SetNodePtr(Node<T> * pNode) { m_pNode = pNode; } 

    SinglyLinkedList<T> * m_pLinkedList; 
    Node<T> * m_pNode; 

public: 
    //some overloaded operators 

}; 
+0

Просто наблюдение, но вы должны использовать 'SinglyLinkedList :: итератор SinglyLinkedList :: Begin() {}' вместо того, что у вас есть –

+1

только наблюдение, [попытаться положить, что в файле .h] (HTTP: //stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file). – WhozCraig

+0

@CaptainObvlious Как и типы, все должно быть хорошо, если они должным образом учитываются. То есть внеклассный def * мог бы * использовать 'Iterator ', а в классе decl мог использовать либо' Iterator', либо ':: Iterator ' [См. live] (http://ideone.com/feyz99) (или я неправильно понял ваше заявление). Независимо от того, я бы сделал это, как вы описываете только для моего собственного здравомыслия. – WhozCraig

ответ

1

Реализация шаблонов членов класса, должны быть в .h файле, а не в отдельном файле .cpp. Каждая единица перевода должна знать реализацию, таким образом, способна создать правильную копию для каждого разного звонка.

Кроме того, следующая строка будет проблемой наверняка

typedef Iterator<T> Iterator; 

потому, что вы используете один и то же имя templetized класса для вашего ЬурейеГо, и что будет производить неопределенное поведение.

+0

Передача в файл h и комментарий typedef. Но как они реализуют что-то вроде списка :: Iterator? – Vivee

+0

проблема с вашим typedef - это не имя, вы можете использовать Iterator, но в этом случае вызовите свой класс Iterator с другим именем, что-то вроде «Iterator_», тогда у вас будет: typedef Iterator_ Iterator; и для компилятора нет проблем – hidrargyro

Смежные вопросы