gpt4 book ai didi

c++ - 在模板类的模板成员函数中返回模板对象

转载 作者:行者123 更新时间:2023-11-28 07:09:17 25 4
gpt4 key购买 nike

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

};

最佳答案

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

另外,下面这行肯定是个问题

typedef Iterator<T> Iterator;

因为您为 typedef 使用了与模板化类相同的名称,这将产生未定义的行为。

关于c++ - 在模板类的模板成员函数中返回模板对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21267359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com