2

C++でいくつかの古いデータ構造を作成します。現在、二重リンクリストクラスで問題が発生しています。

List.h:

template <class T>
class List{

private:

int size;

struct listNode{                        
    T data;
    listNode* next;
    listNode* prev;
    listNode(T newData);
};

listNode * head;                    
listNode * tail;                    
listNode * curr;                    
listNode * find(listNode * place, int k);   
void removeCurrent(listNode * temp);    
public:

List(); 
int getSize() const;                
void insert(int loc, T data);       
void remove(int loc);           
T const & getItem(int loc) const;   
void print();

};

List.cpp:

#include "List.h"
#include <iostream>

using namespace std;

template<class T>
List<T>::List(){
size = 0;
head->next = tail;
head->prev = NULL;
tail->prev = head;
tail->next = NULL;


 }

// getSize: public method that returns the size of the list
template<class T>
int List<T>::getSize() const {
    return size;
}

// insert: public method that inserts data into the list
template<class T>
void List<T>::insert(int loc, T data){
    if(loc <1){
        cout<<"Invalid Location"<<endl;
        return;
    }
    curr = find(head,loc-1);
    listNode * newNode = new listNode(data);
    newNode->next = curr->next;
    newNode->prev = curr;
    newNode->next->prev = newNode;
    curr->next = newNode;
    size++;
}

// remove: public method that inserts data into the list
template<class T>
void List<T>::remove(int loc){
    if(loc <1){
        cout<<"Invalid Location"<<endl;
        return;
    }
    curr = find(head,loc);  // Find the node infront of the target
    removeCurrent(curr);    // Remove that node
}

// removeCurrent: helper function that removes the current node
template<class T>
void List<T>::removeCurrent(listNode* temp){
    listNode* t = temp->next;
    temp->data = t->data;       // HACK: take data from next node
    temp->next = t->next;
    t->next->prev = temp;
    delete t;
    t=NULL;
    size--;
}

// find: private helper function that returns a pointer to the k-1 node
template<class T>
listNode * List<T>::find(listNode * place, int k){
    if((k==0) || (place==NULL))
        return place;
    else return find(place->next,k-1);
}

// getItem: returns data at location loc
template<class T>
T const& List<T>::getItem(int loc) const{
    curr = find(head,loc);
    return curr->data;
}

// print: prints the sequence of variables in the list
template<class T>
void List<T>::print()
{
    curr = head;
    while(curr->next != tail){
        curr = curr->next;
        cout<<curr->data<<endl;
    }
}

//listNode constructor
template<class T>
List<T>::listNode::listNode(T newdata):data(newdata),next(NULL),prev(NULL)
{}

私が得ているエラーは次のとおりです。

エラー:「listNode」はタイプに名前を付けていません。

同様のトラブルシューティングの投稿で提供されているさまざまな提案を試しましたが、それでもこのエラーが発生します。List.cppを含むmain.cppがありますが、実際には空です。

4

1 に答える 1

3

メソッドをクラスのメンバーとして定義し、使用する必要があるため(依存スコープであるため)listNode、メソッドの戻り型でどちらについて話しているのかを指定する必要があります。findListtypenameList<T>

template <class T>
typename List<T>::listNode* List<T>::find(listNode* place, int k)
{
    if ((k == 0) || (place == NULL))
        return place;
    else
        return find(place->next, k-1);
}

c ++ 11を使用していると仮定すると、より安全であるため、nullptr代わりに使用して、コンストラクターで初期化子リストを使用することもできます。NULLList

于 2013-02-06T11:37:15.717 に答える