2012-10-18 61 views
0

我想在C++中編寫一個名爲List的自定義列表類的方法。它是一個由節點組成的鏈表,它是各種項目。對於這個方法,我希望它返回一個指向Node的指針,但得到一個錯誤,說''Node'沒有指定一個類型。「 請注意,sort()方法仍在進行中,我正在等待setMyNext()。如何用方法返回指向對象結構的指針?

template<class Item> 
class List { 
public: 
List(); 
List(const List& original); 
virtual ~List(); 
void sort(); 

List& operator=(const List& original); 
bool operator==(const List& original)const; 
bool operator!=(const List& l2) const; 

private: 
void print()const; 
unsigned mySize; 
struct Node{ 
    Node(); 
    Node(Item item, Node * next); 
    ~Node(); 
    void print()const; 
    Node * setMyNext(Node * newNext); 
    Item myItem; 
    Node * myNext; 
}; 

Node * myFirst; 
Node * myLast; 

friend class ListTester; 
}; 



template<class Item> 
List<Item>::List() { 
myFirst=NULL; 
myLast=NULL; 
mySize=0; 
} 

template<class Item> 
List<Item>::List(const List& original){ 
myFirst=myLast=NULL; 
mySize=0; 
if(original.getSize()>0){ 
    Node * oPtr = original.myFirst; 
    while(oPtr!=NULL){ 
     append(oPtr->myItem); 
     oPtr=oPtr->myNext; 
    } 
} 
} 

template<class Item> 
List<Item>::Node::Node(){ 
myItem=0; 
myNext=NULL; 
} 


template<class Item> 
List<Item>::Node::Node(Item item, Node * next){ 
myItem=item; 
myNext= next; 
} 

template<class Item> 
List<Item>::~List() { 
// cout<<"Deleting List..."<<endl; 
delete myFirst; 
myFirst=myLast=NULL; 
mySize=0; 
} 

template<class Item> 
void List<Item>::sort(){ 
//get my first 2 items 
if(mySize<2) 
    return; 
Node * compareEarly=myFirst; 
Node * compareLate=myFirst->myNext; 
//compare 
if(compareEarly->myItem > compareLate->myItem){ 
//If 2<1, set 0's next pointer to 2, set 2's next to 1, set 1's next to 3 
    cout<<"big"<<endl; 

} 
    //This needs a set previous pointer and set next item's pointer 

    //increment 
} 

template<class Item> 
Node * List<Item>::Node::setMyNext(Node * newNext){ 
myNext=newNext; 
} 
+0

一個建議,對於長代碼,正確格式化很重要。我在閱讀代碼時遇到了一些麻煩... :-( –

回答

1

由於節點名稱的類型。

您嘗試引用的節點實際上是您的模板類List中的節點。 但是,由於您是在類聲明之外定義函數的。 函數的返回類型在全局(或當前命名空間)範圍內。 因此,爲了讓編譯器找到正確的類型,您需要提供Node的全名。

簡而言之:

Node * List<Item>::Node::setMyNext(Node * newNext){ 

此行是錯誤的。它應該是這個。

typename List<Item>::Node* List<Item>::Node::setMyNext(Node * newNext){ 

同樣適用於你的其他功能......

+0

我現在得到這些錯誤:..錯誤:'班級列表'中的'節點'沒有指定類型 錯誤:需要'typename '之前'列表 ::節點'因爲'列表'是一個從屬範圍 – UrhoKarila

+0

@ user1673882,oops我的不好。我忘記了關鍵字typename是需要的,因爲您需要通知編譯器Item是一個模板名稱並且將被解析後來, –

+0

好了,那就做了這個訣竅,謝謝,還提到了「正確地格式化代碼」。我真的很陌生,你能解釋我做錯了什麼嗎? – UrhoKarila

0

你的問題是,編譯器不知道一個「節點*」的定義是什麼becuse函數的定義是在全局命名空間。您需要指定它是編譯器識別它的一部分的名稱空間。

template<class Item> 
List<Item>::Node * List<Item>::Node::setMyNext(Node * newNext){ 
myNext=newNext; 
} 
+0

我試過了,現在它會拋出:在'List之前需要'typename'::節點'因爲'列表'是一個依賴範圍 – UrhoKarila