访问说明符在typedef和forward声明中的作用

时间:2014-02-27 14:29:35

标签: c++ typedef nested-class forward-declaration access-specifier

考虑以下链表类型类的示例代码。我希望声明一个返回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来阻止我的编译器抱怨。我不明白为什么这是必要的。

2 个答案:

答案 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私密。