链表编译出错(代码),求助
//一涉及模板,老编译出错,却检查不出来哪里的毛病,求助。
//link.h
#ifndef link_h
#define link_h
template<class T>
class link
{
link<T>* insert(T val);
private:
link(T linkValue,link<T>* nextPtr);
link(const link<T>& source);
link<T>* duplicate()const;
T value;
link<T>* ptrToNextLink;
friend class list<T>;
friend class listIterator<T>;
};
template<class T>
link<T>::link(T val,link<T>* next)
:value(val),ptrToNextLink(next)
{}
template<class T>
link<T>::link(const link<T> &source)
:value(source.value),ptrToNextLink(source.ptrToNextLink)
{}
template<class T>
link<T>* link<T>::insert(T val)
{//insert a value and place it to the behind of current value
ptrToNextLink=new link<T>(val,ptrToNextLink);
assert(ptrToNextLink!=0);
return ptrToNextLink;
}
template<class T>
link<T>* Link<T>::duplicate()const
{
link<T> *newlink;
if(ptrToNextLink!=0)
newlink=new link<T>(value,ptrToNextLink->duplicate());
else
newlink=new link<T>(value,0);
assert(newlink!=0);
return newlink;
}
#endif
//list.h
#ifndef list_h
#define list_h
#include "link.h"
template<class T>
class list
{
public:
list();
list(const list<T> & source);
virtual ~list();
virtual void add(T add);
virtual void deleteAllValues();
T firstElement()const;
virtual int include(T value)const;
int isEmpty()const;
virtual void removeFirst();
list<T>* duplicate()const;
protected:
link<T>* ptrToFirstLink;
friend class listIterator<T>;
};
template<class T>
list<T>::list()
:ptrToFirstLink(0);
{}
template<class T>
int list<T>::isEmpty()const
{
return ptrToFirstLink==0;
}
template<class T>
void list<T>::add(T val)
{//insert a given new node before the first node
ptrToFirstLink=new link<T>(val,ptrToFirstLink);
assert(ptrToFirstLink!=0);
}
template<class T>
T list<T>::firstElement()const
{
assert(ptrToFirstLink!=0);
return ptrToFirstLink->value;
}
template <class T>
void list<T>::removeFirst()
{
assert(ptrToFirstLink!=0);
link<T>* p=ptrToFirstLink;
ptrToFirstLink=p->ptrToNextLink;
delete p;
}
template<class T>
int list<T>::include(T v)const
{
for(link<T>* p=ptrToFirstLink;p;p->ptrToNextLink)
{
if(v==p->value)return 1;
}
return 0;
}
template<class T>
void list<T>::deleteAllValues()
{
link<T>* next;
for(link<T> *p=ptrToFirstLink;p!=0;p=next)
{
next=p->ptrToNextLink;
p->ptrToNextLink=0;
delete p;
}
ptrToFirstLink=0;
}
template<class T>
list<T>* list<T>::duplicate()const
{
list<T> *newlist=new list<T>;
assert(newlist!=0);
if(ptrToFirstLink)
newlist->ptrToFirstLink=ptrToFirstLink->duplicate();
return newlist;
}
template<class T>
list<T>::list(const list<T>& source)
{
if(source.isEmpty())
ptrToFirstLink=0;
else
{
link<T> * firstLink=source.ptrToFirstLink;
ptrtoFirstLink=firstLink->duplicate();
}
}
template<class T>
list<T>::~list()
{
deleteAllValues();
}
#endif
//test.h
#include "link.h"
#include "list.h"
int main()
{
list<int> lst;
lst.add(2);
lst.add(5);
lst.add(1);
lst.add(9);
lst.add(5);
}