我正在尝试用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)
因为Node 没有命名类型。
您尝试在此处引用的节点实际上是模板类List中的节点。 但是,因为您在类声明之外定义了函数。 函数的返回类型位于全局(或当前名称空间)范围内。 因此,为了让编译器找到正确的类型,您需要提供Node的全名。
简而言之:
Node * List<Item>::Node::setMyNext(Node * newNext){
这条线错了。应该是这样。
typename List<Item>::Node* List<Item>::Node::setMyNext(Node * newNext){
同样适用于您的其他功能......
答案 1 :(得分:0)
你的问题是编译器不知道'Node *'的定义是什么,因为函数定义在全局命名空间中。您需要指定它是编译器识别它的一部分命名空间。
template<class Item>
List<Item>::Node * List<Item>::Node::setMyNext(Node * newNext){
myNext=newNext;
}