考虑以下链接列表类型类的示例代码。我希望声明一个返回迭代器的方法,它是 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/