单链表基于C++的模板实现问题,向模板高熟请教!

lionhu2003 2003-10-01 08:28:27
下面的程序为什么编译可以通过,链接却出错,
小弟不知道错在哪里,完整的程序如下“

///文件slist.h

template <class Type>
class List;

template <class Type>
class ListNode
{
friend class List<Type>;
public:
ListNode();
ListNode(const Type &item);
ListNode<Type> *NextNode()
{
return link;
}
void InsertAfter(ListNode<Type> *p);
ListNode<Type> *GetNode(const Type& item,ListNode<Type> *next);
ListNode<Type> *RemoveAfter();
private:
Type data;
ListNode<Type> *link;
};

template <class Type>
class List
{
public:
List(const Type &value)
{
last=first=new ListNode<Type>(value);
}
~List();
void MakeEmpty();
int Length() const;
ListNode<Type> *Find1(Type value);
ListNode<Type> *Find2(int i);
bool InsertBefore(Type value,int i);
bool InsertAfter(Type value,int i);
Type *Remove(int i);
Type *Get(int i);
private:
ListNode<Type> *first,*last;
};

// 文件slist.cpp

#include "slist.h"

template <class Type>
ListNode<Type>::ListNode():link(NULL)
{}

template <class Type>
ListNode<Type>::ListNode(const Type &item):data(item),link(NULL)
{}

template <class Type>
void ListNode<Type>::InsertAfter (ListNode<Type> *p)
{
p->link=link;
link=p;
}

template <class Type>
ListNode<Type> *ListNode<Type>::GetNode (const Type &item,ListNode<Type> *next=NULL)
{
ListNode<Type> *newNode=new ListNode<Type>(item);
newNode->link=next;
link=newNode;
return newNode;
}

template <class Type>
ListNode<Type> *ListNode<Type>::RemoveAfter ()
{
ListNode<Type> *tempptr=link;
if (tempptr==NULL)
return NULL;
link=tempptr->link;
return tempptr;
}

template <class Type>
List<Type>::~List()
{
MakeEmpty();
delete first;
}

template <class Type>
void List<Type>::MakeEmpty ()
{
ListNode<Type> *q;
while (first->link!=NULL)
{
q=first->link;
first->link=q->link;
delete q;
}
last=first;
}

template <class Type>
int List<Type>::Length () const
{
ListNode<Type> *p=first->link;
int count=0;
while (p!=NULL)
{
count++;
p=p->link;
}
return count;
}

template <class Type>
ListNode<Type> *List<Type>::Find1 (Type value)
{
ListNode<Type> *p=first->link;
while (p!=NULL && p->data!=value)
p=p->link;
return p;
}

template <class Type>
ListNode<Type> *List<Type>::Find2 (int i)
{
if (i<1)
return NULL;
ListNode<Type> *p=first->link ;
int j=1;
while (p!=NULL && j<i)
{
p=p->link ;
j++;
}
return p;
}

template <class Type>
bool List<Type>::InsertBefore (Type value,int i)
{
ListNode<Type> *p=Find(i-1);
if (p==NULL)
return false;
ListNode<Type> *newNode=GetNode(value,p->link);
if (p->link==NULL)
last=newNode;
p->link=newNode;
}

//文件testmain.cpp

#include "slist.h"

void main()
{
int i=100;
List<int> p(i);
}


连接错误如下:

Linking...
testmain.obj : error LNK2001: unresolved external symbol "public: __thiscall List<int>::~List<int>(void)" (??1?$List@H@@QAE@XZ)
testmain.obj : error LNK2001: unresolved external symbol "public: __thiscall ListNode<int>::ListNode<int>(int const &)" (??0?$ListNode@H@@QAE@ABH@Z)
Debug/slist.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

slist.exe - 3 error(s), 0 warning(s)

请问错误在哪里,虽然有提示,但是小弟还是觉得没有错












...全文
52 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
LinuxPanther 2003-10-23
  • 打赏
  • 举报
回复
vc6 是不支持将模板类的声明和实现,分开写的!
Jinbj 2003-10-23
  • 打赏
  • 举报
回复
放在一个文件里就行了.编译连接都没问题,
可是VC的ClassView里面看不到那些原来在CPP里实现的函数了 -_-!
是不是VC6太早了?
darcymei 2003-10-10
  • 打赏
  • 举报
回复
不好意思,我的答案和 tangible7788(唐老鸭)差不多。
export 这个关键字没用过。
还请高手指教
darcymei 2003-10-10
  • 打赏
  • 举报
回复
把// 文件slist.cpp
里的东西放到某个头文件temp.h
中就可以。
在main中#include temp.h即可。
zyzyandzyzy 2003-10-06
  • 打赏
  • 举报
回复
vc好象可以改编译方式的,有一个什么方式是支持模板申明实现分开的,但我没找到过哪里改编译方式,楼下的上
xueweizhong 2003-10-06
  • 打赏
  • 举报
回复
添加如下文件:
slist_inst.cpp:

#include "slist.cpp"
template class slist<int>;
ttlb 2003-10-04
  • 打赏
  • 举报
回复
现在至少我还没见过支持模板seperate compilation编译器。
Wolf0403 2003-10-04
  • 打赏
  • 举报
回复
嗯,据说就是这个 export 目前大多编译器都不支持
lionhu2003 2003-10-03
  • 打赏
  • 举报
回复
<<C++Primer>>中关于模板一章说不是有一个export关键字可以让模板函数的声明和
实现分开吗
为什么不行啊
我用VC6+SP5和DevC++的最新版本都不能用,
这是怎么回事啊
请高手赐教
tangible7788 2003-10-03
  • 打赏
  • 举报
回复
要么模板的声明和实现在一个文件中
要么主程序和模板的实现在一个文件
要么将testmain.cpp文件中的#include "slist.h"换成#include "slist.cpp"
ok?
snipersu 2003-10-01
  • 打赏
  • 举报
回复
把模板的声明于实现放到同一个文件中看看如何。
lionhu2003 2003-10-01
  • 打赏
  • 举报
回复
其实程序不难
只是一个模板的编译和连接问题

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧