Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回模板类的模板成员函数中的模板对象_C++_Templates - Fatal编程技术网

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

C++ 返回模板类的模板成员函数中的模板对象,c++,templates,C++,Templates,出于教育目的,我尝试实现类似std容器的东西。但我一直停留在模板函数声明上。需要语法方面的帮助吗 Error: error C2039: 'Begin' : is not a member of 'SinglyLinkedList<T>'. 错误:错误C2039:“开始”:不是“SinglyLinkedList”的成员。 标题: template<class T> class SinglyLinkedList { public: typedef Iterat

出于教育目的,我尝试实现类似std容器的东西。但我一直停留在模板函数声明上。需要语法方面的帮助吗

Error: error C2039: 'Begin' : is not a member of 'SinglyLinkedList<T>'. 
错误:错误C2039:“开始”:不是“SinglyLinkedList”的成员。
标题:

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;
};
模板
类单链接列表
{
公众:
typedef迭代器;
SingleLinkedList();
SinglyLinkedList(const SinglyLinkedList&其他);
~SinglyLinkedList();
bool IsEmpty(){return!m_pHead}
void-PushFront(T数据);
T&Front();
void PopFront();
无效清除();
迭代器Begin();//错误
//迭代器End();
//迭代器删除(迭代器删除);
私人:
节点*m_pHead;
};
cpp文件:

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

}
模板
迭代器SinglyLinkedList::Begin()
{
}
编辑:

typedef Iterator<T> Iterator;
typedef迭代器迭代器;
只是typedef,所以我可以使用SingleLinkedList::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

};
模板
类迭代器
{
friend SinglyLinkedList;
公众:
迭代器():m_pLinkedList(0),m_pNode(0){}
~Iterator(){};
私人:
迭代器(SingleyLinkedList*pLinkedList,Node*pNode):m_pLinkedList(pLinkedList),m_pNode(pNode){}
SinglyLinkedList*GetListPtr(){return m_pLinkedList;}
Node*GetNodePtr(){return m_pNode;}
void SetListPtr(SinglyLinkedList*pList){m_pLinkedList=pList;}
void SetNodePtr(Node*pNode){m_pNode=pNode;}
单链接列表*m_pLinkedList;
节点*m_pNode;
公众:
//一些重载运算符
};

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

另外,下面的行肯定会有问题

typedef Iterator<T> Iterator;
typedef迭代器迭代器;

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

只是一个观察,但您需要使用
SinglyLinkedList::Iterator SinglyLinkedList::Begin(){}
,而不是只使用观察,.@CaptainObvlious-Like类型应该可以,只要它们被正确地解释。也就是说,类外def可以使用
迭代器
,类内decl可以使用
迭代器
::迭代器
(或者我误解了你的说法)。不管怎样,我会按照你描述的那样做,只是为了我自己的理智。@WhozCraig完全正确。假装它已被编辑成建议;)传输到h文件并注释typedef帮助。但是他们是如何实现像list::Iterator这样的东西的呢?typedef的问题不在于名称,你可以使用Iterator,但是在这种情况下,用一个不同的名称调用你的Iterator类,比如“Iterator”,那么你就有了:typedef Iterator\Iterator;编译器也没有问题