【发布时间】: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 运行良好。我想我只是遇到了语法错误,因为这对我来说是一个未知的领域。
【问题讨论】:
-
至少在第一次尝试中,编写嵌套在它所迭代的类中的迭代器类通常是最容易的。
-
那会很聪明...
-
嗯……这两种方法都可以。将迭代器放在外面实际上有助于使容器能够处理不完整的类型。此外,即使是嵌套的迭代器类也需要是一个模板,因为您需要一个额外的参数来区分
iterator和const_iterator。
标签: c++ templates iterator linked-list