你如何键入别名嵌套类?

时间:2016-12-11 02:53:52

标签: c++ c++11

我无法弄清楚如何对嵌套类使用类型别名。下面是链表的类声明。我最初使用nodelist和迭代器类以及linkedlist实现了linkedlist类,现在我正在尝试将它们嵌入到linkedlist中。为了使类更容易阅读,我宁愿在任何地方使用迭代器而不是使用linkedlist :: iterator,所以我想将别名键入为迭代器。以下是我的一次尝试,无论我改变什么,我最终都会遇到一个或另一个错误。这个因为行

而无效
class linkedlist::iterator;

导致错误(g ++ -std = c ++ 11)' iterator'在班级链接列表'没有命名类型。

class linkedlist;
class linkedlist::iterator;
class linkedlist::node;
using iterator = linkedlist::iterator;
using node = linkedlist::node;


class linkedlist
{
public:

  linkedlist();  
  iterator begin(); 
  iterator end();
  iterator insert(iterator pos, long data);
  void print();

  node* root;
  node* final;



private:
  class iterator
  {
  public:


    const linkedlist* list;
    node* ref;

    iterator();
    iterator(node& ref, const linkedlist& list);

    long& operator*();
    long* operator->();
    iterator& operator++(); 
    iterator& operator--();
    bool operator==(iterator rhs);
    bool operator!=(iterator rhs);

  };


private:  
  class node
  {
  public:

    long& operator*();

    long data;
    node* ptr_f;
    node* ptr_b;
  };

};

1 个答案:

答案 0 :(得分:2)

class linkedlist;

这称为"前向声明"。

只能向前声明顶级课程。嵌套类不能在类之外向前声明。

现在,您在定义类的过程中,可以在类 范围内向前声明嵌套类

class linkedlist {

    class iterator;

    // Stuff that uses the forwardly-declared iterator class

    class iterator {

        // And the definition of the iterator class
    };
};

前方声明的工作方式。

在您的示例中,只需移动"使用"在 linkedlist类的定义之后(在使嵌套类公开之后)别名,这就是全部。

我同意,嵌套的前向声明在其范围之外是可能的,但它们并非如此。这就是生活。