返回模板类的模板成员函数中的模板对象

时间:2014-01-21 19:30:57

标签: c++ templates

出于教育目的,我尝试实现类似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 for Iterator。我有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

};

1 个答案:

答案 0 :(得分:1)

类的模板成员的实现必须在.h文件中,而不是在单独的.cpp文件中。每个翻译单元都需要知道实现,这样就能够为每个不同的寺庙化呼叫创建正确的实例化。

此外,以下行肯定会成为问题

typedef Iterator<T> Iterator;

因为你的typedef使用了与templetized类相同的名称,这将产生未定义的行为。