为什么结构在返回值时定义所需的范围解析?

Aru*_*run 6 c++ scope class

我有一个单链表实现,如下所示:

class SinglyLinkedList
{
  struct Node
  {
    Node * _pNext;
    int    _data;
  };

public:

  Node * SomeFun(Node * ip1, Node * ip2);  
  // Some more methods here
};
Run Code Online (Sandbox Code Playgroud)

现在实现这个类的一个方法

CPP

Node * SinglyLinkedList::SomeFun(Node * ip1, Node * ip2)
{
  //Some code and return
}
Run Code Online (Sandbox Code Playgroud)

我不理解的奇怪行为是,在编译时,编译器拒绝识别返回类型中的"Node"类型,除非我将其指定为 SinglyLinkedList :: Node.但是可以识别函数参数的相同类型而不明确指定它.理想情况下,我觉得在这两种情况下都不需要这种显式指定,因为Node在同一个类中定义.任何人都可以对此有所了解吗?

For*_*veR 8

SinglyLinkedList::Node * SinglyLinkedList::SomeFun
Run Code Online (Sandbox Code Playgroud)

在这里,你不在班级范围内.但是在参数子句中,或者在函数中你是IN类范围,所以你不Node应该从类中获得限定SinglyLinkedList,因为编译器已经知道了.

n3376 3.3.7/1

以下规则描述了在类中声明的名称范围.

扩展到或超过类定义结尾的声明的潜在范围也扩展到由其成员定义定义的区域,即使成员是在类之外的词法上定义的(这包括静态数据成员定义,嵌套类)定义,成员函数定义(包括成员函数体和此类定义的声明者部分的任何部分,它们遵循declarator-id,包括parameter-declaration-clause和任何默认参数