求教,模板源程序文件的编译问题

lincoder666 2004-07-02 12:13:57
我写了个模板SqList,给个大概,看源文件布局即可
//头文件SqList.h :SqList的定义
template<class T> class SqList
{
private:
T *elem; //数据存储地址
int length; //当前长度
int listsize; //当前分配的存储量
int listincrement; //分配增量

public:
SqList(int size=0); //构造函数
~SqList(); //析构函数
void ClearList(); //置为空表

T PrevElem(T cur_e) const;
T NextElem(T cur_e) const;
bool Insert(int pos,T e);
bool Delete(int pos,T& e) ;

} ;

//另一个文件SqList.cpp : SqList的实现
#include "SqList.h"

using namespace std;

template<class T>
SqList<T>::SqList(int size):length(0),listsize(size),listincrement(10)
{
if(!size) cerr<<"size is zero"<<'\n';
elem=new T[size];
if(!elem) exit(1);
}

template<class T>
SqList<T>::~SqList()
{
delete [] elem;
}

template<class T>
inline void SqList<T>::ClearList()
{
delete [] elem;
elem=new T[listsize];
length=0;
}

template<class T>
bool SqList<T>::Insert(int pos,T e)
{
if(pos<1 || pos>length+1) return false;

T* p;
T* q;
if(length>=listsize)
{
listsize+=listincrement;
T* temp=new int[listsize];

q=elem;
p=temp;

for(int i=0;i<length;i++)
{
*p=*q;++p,++q;
}
q=elem;
elem=temp;
delete [] q;
}

q=&(elem[pos-1]);
p=&(elem[length-1]);
while(p>=q) { *(p+1)=*p;--p;}
*(q)=e;
++length;

return true;
}

template<class T>
bool SqList<T>::Delete(int pos,T& e)
{
if(pos<1 || pos>length) return false;
e=elem[pos-1];
for(int i=pos-1;i<length;i++)
{
elem[i]=elem[i+1];
}
--length;
return true;
}

//main.cpp :模板使用

#include <iostream>
#include <stdlib.h>
#include "SqList.h"//顺序表
//#include "SqList.cpp"
using namespace std;

int main(int argc, char *argv[])
{
system("pause");
SqList<int> lt(0);//int链表
lt.Insert(1,12);
lt.Insert(2,13);
system("pause");
return 0;
}

我第一次写模板!
我在Dev-C++编译不过,错误信息
[Linker error] undefined reference to `SqList<int>::SqList(int)'

程序是没问题的,只是不懂的怎么使用模板,组织模板文件?
请问我应该怎么做才正确?

...全文
75 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lincoder666 2004-07-02
  • 打赏
  • 举报
回复
为什么我这样不可以,为什么又要那样做呢,谁能解释一下原因?
zf0579 2004-07-02
  • 打赏
  • 举报
回复
将函数体嵌入到类中 删除掉SqList.cpp,就可以了。你看看STL都是这样写的。
langzi8818 2004-07-02
  • 打赏
  • 举报
回复
模板的定义应该在头文件中
i_Fan 2004-07-02
  • 打赏
  • 举报
回复
同意nzzt。
最好是将模板定义与实现放在同一个头文件中!

i_fan
nzzt 2004-07-02
  • 打赏
  • 举报
回复
模板函数要写在头文件中。
因为模板函数在使用中要先根据类型去特化,然后生成代码。不同的类型生成的代码当然也就不一样,如果编译器找不到函数的定义,又如何去生成代码呢。

有些编译器可以支持模板函数写在cpp文件中的写法,要在函数前面加上export修饰符表明这个模板会在cpp文件中给出定义,让编译器推迟实现。

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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