0

テンプレートを使用して、c++で独自のリンクリストを実装したいと思います。しかし、私はいくつかのコンパイラエラーに遭遇します。コードは次のとおりです。

template <class T>
class Node{
T datum;
Node _next = NULL;
 public:
 Node(T datum)
{
    this->datum = datum;
}
 void setNext(Node next)
 {
     _next = next;
 }
 Node getNext()
 {
     return _next;
 }
 T getDatum()
 {
     return datum;
 }          
};
template <class T>
class LinkedList{
Node<T> *node;
Node<T> *currPtr;
Node<T> *next_pointer;
int size;
public:
LinkedList(T datum)
  {
      node = new Node<T>(datum);
      currPtr = node;  //assignment between two pointers.
      size = 1;
  }
void add(T datum)
 {
   Node<T> *temp = new Node<T>(datum);
   (*currPtr).setNext((*temp));
   currPtr = temp;       
   size++;
 }
T next()
{
   next_pointer = node;
   T data = (*next_pointer).getDatum();
   next_pointer = (*next_pointer).getNext();
   return data;
}
int getSize()
{
   return size;
}   
};

このクラスをインスタンス化しようとすると、次のエラーが発生しました。

LinkedList.cpp: In instantiation of `Node<int>':
LinkedList.cpp:35:   instantiated from `LinkedList<T>::LinkedList(T) [with T = int]'
LinkedList.cpp:60:   instantiated from here
LinkedList.cpp:7: error: `Node<T>::_next' has incomplete type
LinkedList.cpp:5: error: declaration of `class Node<int>'
make[2]: *** [build/Debug/Cygwin-Windows/LinkedList.o] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

NetBeansIDEを使用しています。誰かが私にそれを改善するためのいくつかの提案を与えることができますか?どうもありがとう!!

4

4 に答える 4

1

Node<T> *node;で行うときと同じように、クラスLinkedListでも同じことを行う必要がありますNode

template <class T>
class Node{
    T datum;
    Node<T> *_next;//template parameter
                   //also, need to make this a pointer and initialized in constructor
public:

//...
    void setNext(Node<T> next) //template parameter
    {
        _next = next;
    }
    Node<T> getNext() //template parameter
    {
        return _next;
    }
//...
};
于 2012-06-19T19:51:49.310 に答える
1

構文が間違っていることに加えて:

class Node{
T datum;
Node _next = NULL;
//....

メンバーと同じタイプのメンバーを持つことはできません。ただし、ポインタを使用できます。

template <class T>
class Node{
T datum;
Node<T>* _next;

コンストラクターに設定します(=NULLそこでは合法ではないため)。

関連:クラスがそれ自体の静的メンバーを持つことが許可されているのに、非静的メンバーを持つことが許可されていないのはなぜですか?

于 2012-06-19T19:47:50.060 に答える
1

クラスには、直接ではなく、次へのポインタNodeが含まれている必要があります。ここに、コンパイラーでは処理できない再帰型があります。NodeNode

もう1つの間違いは、このようなメンバーを初期化できないことです。コンストラクターでそれを行う必要があります。

したがって、コンストラクターでポインターを置き換えNode _next = NULL;て初期化します。Node *_next;_nextnullptr

于 2012-06-19T19:48:07.423 に答える
1

それはちょうどこの行かもしれません:

Node _next = NULL;

あなたは本当にそれがポインタ()である必要がありますNode<T>* _next。クラスに独自のタイプのインスタンスが含まれている場合、そのインスタンスにはそのタイプの独自のインスタンスが含まれることになります

于 2012-06-19T19:48:28.640 に答える