c++ - 访问说明符在 typedef 和前向声明中的作用

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

考虑以下链接列表类型类的示例代码。我希望声明一个返回迭代器的方法,它是 Node*typedef。但是,Node 是一个私有(private)嵌套类,因此为了生成 typdef,我需要让编译器通过前向了解 Node声明。

天真地,我认为将两者都默认为私有(private)会起作用;像这样的东西:

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

这会导致第 4 行出现编译时错误:

'typedef class List::Node* List::Iterator' is private
compilation terminated due to -Wfatal-errors.

不难看出为什么前向声明class Node;属于私有(private)部分,但是typedef Iterator Node*;呢?这可能是由于我对 typedef 关键字缺乏理解,但是为什么应用哪个访问说明符很重要呢?我认为由于 Node 类的可见性,private 更有意义。

这与 typedef 是公共(public)接口(interface)的一部分有关吗?是否所有 typedef 都必须以 public 可见性进行声明?


编辑: 请允许我澄清一下,我知道我可以通过将 typedef 移至公共(public)来阻止编译器提示。我不明白的是为什么这是必要的。

最佳答案

您可以简单地将 typedef name 设置为公共(public)名称。尝试以下方法

class List
{
public:
    typedef class Node* Iterator;

还要考虑到,对于这两个类,您都忘记在右大括号后放置分号。:)

关于c++ - 访问说明符在 typedef 和前向声明中的作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22071470/

相关文章:

c++ - boost 定时器 : how to get time when I need?

c++ - typedef 速记头文件是不好的做法吗?

c++ - 带有字符串和 bad_alloc 检查的构造函数

iPhone SDK << 含义?

c - 在 C 中定义枚举类型

C++:operator<< 嵌套类中的重载

java - Android & Java 内部类概念

c# - 嵌套类 : Cannot access non-static field in static context

c++ - 以编程方式制作bmp图像

c++ - 如何将 vector 传递给基于推力的 odeint 观察器的构造函数,以便可以在仿函数中读取它