为自定义类编写迭代器

时间:2014-01-05 20:00:59

标签: c++ iterator

我将在前言中说我主要处理其他人编写的示例,因此我对模板类和朋友类的理解不足。我正在尝试编写循环列表类:

#ifndef CIRCLIST_H
#define CIRCLIST_H
#include <cstdlib>
#include <iostream>

using namespace std;

template <class T>
class Node
{
    public:
        Node() : next(NULL), prev(NULL) {}
        Node(const T& v) : value(v), next(NULL), prev(NULL) {}

        T value;
        Node<T>* next;
        Node<T>* prev;
};

template <class T> class circList; //Forward declaration

template <class T>
class circIterator
{    
    public:
        circIterator() : ptr(NULL) {}
        ~circIterator() {}

        T& operator*() { return ptr->value; }

        circIterator<T> & operator=(const circIterator<T> & old) { ptr = old.ptr; return *this; }
        circIterator<T> & operator++() { ptr = ptr->next; return *this; }
        circIterator<T> & operator--() { ptr = ptr->prev; return *this; }

        friend class circList<T>;
        friend bool operator==(const circIterator<T>& l, const circIterator<T>& r) { return l.ptr == r.ptr; }
        friend bool operator!=(const circIterator<T>& l, const circIterator<T>& r) { return l.ptr != r.ptr; }

   private: 
       Node<T>* ptr;
};


template <class T>
class circList
{
    //class circIterator;

    public:
        circList() : entry(NULL), vsize(0) {}
        ~circList() {}

        unsigned int size() const {return size;}

        typename circList<T>::template circIterator<T> add(T const& v, circIterator<T> itr);

   private:
       Node<T>* entry;
       unsigned int vsize;   
};

template <class T>
typename circList<T>::template circIterator<T> circList<T>::add(T const& v, circIterator<T> itr)
{...}

当我编写一个简单的main.cpp时,它只是声明了一个circList,我得到错误:

error: no class template named 'circIterator' in 'class circList<int>'

错误引用最后一行,其中实现了add函数。这到底是什么意思?这是否意味着在某个地方我必须编码一个circIterator应该如何“归属于”circList?我真的不知道。

1 个答案:

答案 0 :(得分:1)

该错误是由于circList<T>::template您试图访问未为该类设置的标识符template(这是一个关键字)这一事实引起的。

只需将函数定义为:

template <class T>
circIterator<T> circList<T>::add(T const& v, circIterator<T> itr) {...}

并声明为:

circIterator<T> add(T const& v, circIterator<T> itr);

here就是一个有效的例子。