我无法弄清楚如何对嵌套类使用类型别名。下面是链表的类声明。我最初使用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;
};
};
答案 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
类的定义之后(在使嵌套类公开之后)别名,这就是全部。
我同意,嵌套的前向声明在其范围之外是可能的,但它们并非如此。这就是生活。