7

以下に示すように、個別にリンクされたリストの実装があります。

ヘッダ

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

public:

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

このクラスのメソッドの1つを実装するとき

CPP

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

私が理解していない奇妙な動作は、コンパイル時に、 SinglyLinkedList::Nodeとして指定しない限り、コンパイラが戻り値の型で型 "Node" を認識することを拒否すること です。しかし、関数の引数は明示的に指定しなくても同じ型として認識されてしまいます。どちらの場合も、Node は同じクラスで定義されているため、明示的に指定する必要はないと思いました。誰でもこれに光を当てることができますか?

4

2 に答える 2

9
SinglyLinkedList::Node * SinglyLinkedList::SomeFun

ここでは、クラススコープではありません。ただし、パラメーター句または関数では、クラススコープ内にあるため、コンパイラーは既にそれを知っているため、修飾しないでください。つまりNode、クラスからのものです。SinglyLinkedList

n3376 3.3.7/1

次の規則は、クラスで宣言された名前のスコープを示しています。

クラス定義の末尾まで、または末尾を超えて拡張される宣言の潜在的なスコープは、メンバーがクラスの外部で語彙的に定義されている場合でも、そのメンバー定義によって定義される領域に拡張されます(これには、静的データ メンバー定義、ネストされたクラスが含まれます)。定義、メンバー関数の定義 (メンバー関数の本体と、declarator-id に続くそのような定義の宣言子部分の任意の部分を含み、parameter-declaration-clause および任意のデフォルト引数を含む)

于 2013-06-06T05:06:13.467 に答える
3

ForEveR の回答に加えて、この問題は C++11 で末尾の return 句を使用して解決されます。

// 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 に答える