【问题标题】:Problems creating an iterator for my templated doubly linked list为我的模板化双向链表创建迭代器时出现问题
【发布时间】:2012-04-24 03:51:02
【问题描述】:

为了好玩,我正在创建自己的双向链表实现,我已经完成了列表本身的编写,但现在我正在尝试向它添加一个迭代器,但我对此的语法规则感到困惑东西。这是我得到的错误:

error C2990: 'd_list' : non-class template has already been declared as a class template

这是所有位于的头文件:

/****************************/
/* d_list class             */
/* with exceptions classes  */
/****************************/
class d_list_error{};
class d_list_empty{};

template <class T>
class d_list_iter;

template <class T>
class d_list{
public:
    d_list();
    d_list(const d_list &_dl);
    d_list &operator=(const d_list &_dl);
    ~d_list();

    void push_back(T item);
    void push_front(T item);

    void pop_back();
    void pop_front();

    bool isEmpty() const;
    unsigned int size() const;

    void clear();
private:
    struct node{
        node *prev; 
        node *next;
        T    data;
    };
    node             *head;
    node             *tail;
    unsigned int     currSize;
    d_list_iter<T>   *dli;

    /* Utility Functions */
    void initFirstEle(T item, node* first);
    void copyAll(const d_list<T> &_dl);
};

/*************************/
/* d_list iterator class */ 
/*************************/

class d_iter_already_exists {};

template <class T>
class d_list_iter{
public:
    d_list_iter(const d_list &_dl);
    ~d_list_iter();
    T getNext() const;

private:
    friend class d_list;
    d_list<T>   *dl;
    node        *next;
    node        *prev;
    bool        valid;
};

下面是为 d_list 定义的所有成员函数。我还没有开始为迭代器编写它们。根据我的所有测试,d_list 运行良好。我想我只是遇到了语法错误,因为这对我来说是一个未知的领域。

【问题讨论】:

  • 至少在第一次尝试中,编写嵌套在它所迭代的类中的迭代器类通常是最容易的。
  • 那会很聪明...
  • 嗯……这两种方法都可以。将迭代器放在外面实际上有助于使容器能够处理不完整的类型。此外,即使是嵌套的迭代器类也需要是一个模板,因为您需要一个额外的参数来区分 iteratorconst_iterator

标签: c++ templates iterator linked-list


【解决方案1】:

您必须通过在类声明之外指定模板参数来指定模板类型。

具体来说,您应该在template &lt;typename&gt; class d_list_iter 的声明中写(类似)d_list&lt;T&gt; 而不是简单的d_list。这包括您对friend 的使用。

同样适用于节点。假设它们是公开展示的:

typename d_list&lt;T&gt;::node 而不是简单的 nodetemplate &lt;typename&gt; class d_list_iter 的声明中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 2015-07-14
    • 1970-01-01
    • 2015-07-13
    相关资源
    最近更新 更多