2014-01-21 117 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