考虑以下链表类型类的示例代码。我希望声明一个返回Iterator的方法,它是typedef
的{{1}}。但是,Node*
是一个私有嵌套类,因此为了生成Node
,我需要让编译器知道typdef
的前向声明。
天真地,我认为两个违约都是私有的会工作;像这样的东西:
Node
导致第4行的编译时错误:
'typedef class List :: Node * List :: Iterator'是私有的 由于-Wfatal-errors而导致编译终止。
要了解为什么前瞻性声明class List
{
class Node;
typedef Node* Iterator;
public:
List() : head_(NULL), tail_(NULL) {}
Iterator begin() {return head_;}
private:
class Node
{
private:
int data_;
};
Node* head_;
Node* tail_;
};
int main()
{
List list;
List::Iterator = list.begin();
return 0;
}
属于私人部分并不是困难的,但是class Node;
怎么办?这可能是由于我对typedef Iterator Node*;
关键字缺乏了解,但为什么应用哪个访问说明符很重要?由于typedef
类的可见性,我认为private
更有意义。
这是否与Node
成为公共接口的一部分有关?是否必须使用typedef
可见性声明所有typedef?
编辑: 请允许我澄清一下,我知道我可以通过将typedef移动到public来阻止我的编译器抱怨。我不明白为什么这是必要的。
答案 0 :(得分:1)
您可以简单地将typedef名称设为公共名称。请尝试以下
class List
{
public:
typedef class Node* Iterator;
另外考虑到两个课程你忘了在括号后放置分号。:)
答案 1 :(得分:1)
List::Iterator
是私有的,因此无法使用该名称,但可以推断出类型
List l;
List::Iterator it = l.begin(); // Illegal
auto it = l.begin(); // legal
或
template <typename IT>
void foo(IT it);
foo(l.begin()); // legal
顺便说一句,您可能会List::Iterator
公开,并保持List::Node
私密。