c++ - 你如何键入别名嵌套类?

标签 c++ c++11

<分区>

我不知道如何为嵌套类使用类型别名。下面是链表的类声明。我最初用节点和迭代器类与链表一起实现了链表类,现在我试图将它们嵌套在链表中。为了使该类更易于阅读,我宁愿在任何地方都使用迭代器而不是 linkedlist::iterator,所以我想将它作为迭代器键入别名。以下是我的尝试之一,无论我更改什么,我都会遇到一个或另一个错误。这个行不通,因为行

class linkedlist::iterator;

导致错误 (g++ -std=c++11) 'iterator' in 'class linkedlist' does not name a type.

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;
  };

};

最佳答案

class linkedlist;

这称为“前向声明”。

只有顶级类可以被前向声明。嵌套类不能在类外预先声明。

现在,一旦您处于定义类的过程中,您就可以在类的范围内前向声明嵌套类:

class linkedlist {

    class iterator;

    // Stuff that uses the forwardly-declared iterator class

    class iterator {

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

前向声明就是这样工作的。

在您的示例中,只需在 linkedlist 类的定义之后(在使嵌套类公开之后) 移动两个“using”别名,就这样。

我同意,如果嵌套前向声明是可能的,在它们的范围之外,那会很好,但事实并非如此。这就是生活。

关于c++ - 你如何键入别名嵌套类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41082517/

相关文章:

用于 Windows 的 C++11 编译器

c++ - 可变参数模板和类型特征

c# - 注册免费 COM 互操作。程序集 B 引用程序集 A?

c++ - 处理大数据网络文件计算n个最近节点的高效算法

c++ - 关于线程安全的困惑

c++ - 类型已知时如何调用 std::forward

c++ - 有趣的 stdext::hash_value() 实现

c++ - 如何强制复制省略,为什么它不能与删除的复制构造函数一起使用?

c++ - C++ 中的 () 运算符是什么?

c++ - 使用折叠表达式打印每个元素之间的空格