7

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

标题

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

public:

  Node * SomeFun(Node * ip1, Node * ip2);  
  // Some more methods here
};

现在在实现此类的方法之一时

CPP

Node * SinglyLinkedList::SomeFun(Node * ip1, Node * ip2)
{
  //Some code and return
}

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

4

2 回答 2

9
SinglyLinkedList::Node * SinglyLinkedList::SomeFun

在这里,您不在班级范围内。但是在参数子句或函数中,您是在类范围内,所以您不应该限定,即Node来自 class SinglyLinkedList,因为编译器已经知道这一点。

n3376 3.3.7/1

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

延伸到或超过类定义结尾的声明的潜在范围也延伸到由其成员定义定义的区域,即使成员是在类外部的词法定义的(这包括静态数据成员定义、嵌套类定义、成员函数定义(包括成员函数体和此类定义的声明部分的任何部分,其跟在 declarator-id 之后,包括参数声明子句和任何默认参数)

于 2013-06-06T05:06:13.467 回答
3

添加到 ForEveR 的答案中,这个问题在 C++11 中使用尾随返回子句解决。

// Regular return style
SinglyLinkedList::Node* SinglyLinkedList::SomeFun(Node * ip1, Node * ip2) { ... }

// Trailing return style
auto SinglyLinkedList::SomeFun(Node * ip1, Node * ip2) -> Node * { ... }

在常规样式中,您尚未进入类范围(它仅在方法的限定名称结束后才开始)。

然而,在尾随返回样式中,返回类型在类范围内(如参数),因此不需要限定。

于 2013-06-06T07:46:36.563 回答