2012-10-18 81 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