2014-01-21 118 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() 
{ 

} 

編輯:

typedef Iterator<T> Iterator; 

只是typedef的,所以我可以使用SinglyLinkedList :: Iterator作爲迭代器。我有迭代器類/它看起來像這樣:

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 ::開始(){}',而不是你有什麼 –

+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 '[見它活](http://ideone.com/feyz99) (或者我誤解了你的陳述)。無論如何,我會這樣做,只是爲了我自己的理智而描述。 – WhozCraig

回答

1

類的模板成員的實現,必須在.h文件中,而不是在一個單獨的.cpp文件。每個翻譯單元都需要知道實現,這樣可以爲每個不同的寺廟化調用創建正確的實例。

此外,下面的線將肯定

typedef Iterator<T> Iterator; 

一個問題,因爲你正在使用您的typedef的templetized類相同的名稱,這將產生不確定的行爲。

+0

轉移到h文件和註釋typedef幫助。但他們如何實現像列表 ::迭代器? – Vivee

+0

您的typedef的問題不是名稱,您可以使用Iterator,但在這種情況下,使用不同的名稱調用您的Iterator類,如'Iterator_',那麼您將擁有:typedef Iterator_ Iterator;編譯器沒有問題 – hidrargyro