7

現在、リスト クラスにプライベートなノード構造を使用して、リスト テンプレート クラスにソート アルゴリズムを実装しようとしています。ノード型へのポインターを返すいくつかのプライベート再帰関数を使用しているため、g++ で宣言エラーが発生します。ここに私が持っているもののサンプルがあります -

template<class T>
class SList
{
private:
    struct NODE
    {
        T* elem;
        NODE* next;
    } *_head, *_tail;

NODE* sort(NODE* node);

public:
    //other declarations...

}

template<class T>
NODE* SList<T>::sort(NODE* node) //Error: 'NODE' does not name a type
{
    //sorting algorithm
}

これは c++ の制限ですか、それとも何か不足していますか?

4

3 に答える 3

13

は内部クラスであるため、の定義がNodeどこから来たのかをコンパイラに伝える必要があります。Node

SListさらに、 Node のテンプレートパラメータが何であるかによって Node の定義が変わります (従属型です) 。

したがって、次Nodeのように明示的に参照する必要があります。

template<class T>
typename SList<T>::NODE* SList<T>::sort(typename SList<T>::NODE* node) 
{
    //sorting algorithm
}
  • Node は依存型であるため、注意してくださいtypename(の型に依存しますSList) 。
  • SList<T>::NodeNode は の型に依存する型であるため、注意してくださいSList
于 2012-11-26T06:40:30.287 に答える
2

以下は正常に動作します:

template<class T>
typename SList<T>::NODE* SList<T>::sort(typename SList<T>::NODE* node)
^^^^^^^^^^^^^^^^^^^                     ^^^^^^^^^^^^^^^^^^^

これは c++ の制限ですか?

いいえNODEのスコープ外で名前が付けられた構造/タイプが存在する可能性があるためSList<>です。実際には、 C++ が提供する機能であり、異なるスコープで同じ名前の型を持つことができます。

「キーワードが必要な理由」についてtypenameは、こちらを参照してください。

于 2012-11-26T06:40:40.657 に答える
1

参照したい型は SList 内にあるため、次のように参照する必要があります。

template<class T>
typename SList<T>::NODE* SList<T>::sort(typename SList<T>::NODE* node);
于 2012-11-26T06:39:27.100 に答える