在c ++中实现嵌套类函数

时间:2013-06-08 16:36:59

标签: c++

这就是我的目标。

template<class T>
class List{
    Node<T> head;
    int size;
public:
    class Iterator;

template <class T>
class List<T>::Iterator{
public:
Iterator& operator++();

我正试图这样实施:

template<class T>
typename List<T>::Iterator& List<T>::Iterator::operator++()

但它一直告诉我“未找到会员声明”

修改 这就是整个相关代码:

template <class T>
class Node {
    T data;
    Node<T>* next;
public:
    Node () : next(0){};
    Node (const T& info, Node<T>* next = 0) : data(info), next(next){};
    friend class List<T>;
    friend class Iterator;
    friend class ConstIterator;
};

template<class T>
class List{
    Node<T> head;
    int size;
    void listSwap(Node<T>* node1, Node<T>* node2);
public:
    class Iterator;
    class ConstIterator;
    List ();
    List(const List<T>& list);
    List& operator=(const List<T>& list);
    ConstIterator begin() const;
    Iterator begin();
    ConstIterator end() const;
    Iterator end();
    void insert(const T& t);
    void insert(const T& t,const Iterator& it);
    void remove(const Iterator& it);
//  template<class Function>
//  ConstIterator find(Function f);
    template<class Function>
    Iterator find(Function f);
    template<class Function>
    void sort(Function f);
    int getSize();
    bool operator==(const List<T>& list2) const;
    bool operator!=(const List<T>& list2) const;
    ~List();
};

template <class T>
class List<T>::Iterator{
    List<T>* list;
    Node<T>* index;
public:
    Iterator(List<T> list);
    Iterator(List<T> list, Iterator& it);
    Iterator& operator++();
    Iterator operator++(int);
    T operator*();
    bool operator==(const Iterator& iterator2);
    bool operator!=(const Iterator& iterator2);
    ~Iterator();
    friend class List<T>;
};

以为我认为没关系:/ 有时令人沮丧.... 谢谢你们的帮助!

3 个答案:

答案 0 :(得分:1)

如果迭代器是嵌套类,则template<class T> class List<T>::Iterator类定义中不需要Iterator。只需class Iterator

template<class T>
class List{
  Node<T> head;
  int size;
public:

  class Iterator
  {
   public:
    Iterator& operator++();
   ....
  };
  ....
};

或者你错过了};课程的结束List

template<class T>
class List{
    Node<T> head;
    int size;
public:
    class Iterator;
};
^^ HERE!

答案 1 :(得分:0)

我看到一些明显的错误,因为在定义List之前类List<T>::Iterator没有关闭,但我认为它是因为你切断了部分代码。

不幸的是,我无法重现你的情况。以下代码:

class List {
    int size;
public:
    class Iterator;
};

template <class T>
class List<T>::Iterator {
    public:
        Iterator& operator++();
};

template <class T>
typename List<T>::Iterator& List<T>::Iterator::operator++() {
    return *this;
}

int main() {
}

它在g ++(4.6.3)和clang ++(3.1)下编译得很好,所以问题就在于你没有向我们展示的其他地方。

答案 2 :(得分:0)

你的第一个代码示例似乎被忽视了。

至于你的第二个(更长的)代码部分,除了一个可疑区域外,我没有看到它的错误。 friend中的Node声明将引用全局命名空间中的一些非模板IteratorConstIterator类。同时,Iterator中的ConstIteratorList是不属于全局命名空间的模板。 friend中的Node声明是否应该引用Iterator中的ConstIteratorList