怎么会找不到定义呢?

kolige 2009-05-28 11:57:59
test.h:

template<class T>
class List
{
protected:
int size;
public:
List():size(0){}
bool empty()
{
return size==0;
}
virtual void insert(T t,int position)=0;
};
template<class T>
class ArrayList:public List<T>
{
private:
int maxSize;
T* t;
public:
ArrayList(int initSize=20):maxSize(initSize)
{
t=new T[initSize];
}
void insert(T t,int position);
};


test.cpp:

#include "test.h"
template<class T>
void ArrayList<T>::insert(int t,int position)
{
cout << "ArrayList" << endl;
} ;

然后再新建一个吹cpp文件

#include "iostream"
#include "test.h"
using namespace std;
int main()
{
int a;
List<int> *l=new ArrayList<int>;
l->insert(a,5);
return 0;
}

结果在连接的时候出错,说8: undefined reference to `ArrayList<int>::insert(int, int)'。
而把test.cpp里面的内容放到test.h里面就可以。
我想问问是什么原因?
运行环境是CFREE,而且.h和.cpp都是直接添加的。难道还要什么手段,把.cpp和.h文件关联起来?编译器不会自己寻找??
...全文
176 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
z15881328993 2009-05-28
  • 打赏
  • 举报
回复
Jalien 2009-05-28
  • 打赏
  • 举报
回复
都支持包含编译模型的,使用包含编译模型就可以将定义和声明分离开来。[Quote=引用 9 楼 ilysony 的回复:]
引用 2 楼 eatsweetpotato 的回复:
模板的要求,须将类中函数定义与类定义放在一起


现在大多数编译器都不支持模板的声明和定义不在一起
[/Quote]
kolige 2009-05-28
  • 打赏
  • 举报
回复
7楼:怎么把非模板情况下两个cpp文件生成的目标文件都链接起来??

8楼:那就是说除非建工程,否则编译器不会自动找H文件的实现cpp文件。是不是所有编译器都这样的?
Jalien 2009-05-28
  • 打赏
  • 举报
回复
使用包含编译模型吧。
test.h

#ifndef TEST_H
#define TEST_H
template<class T>
class List
{
protected:
int size;
public:
List():size(0){}
bool empty()
{
return size==0;
}
virtual void insert(T t,int position)=0;
};
template<class T>
class ArrayList:public List<T>
{
private:
int maxSize;
T* t;
public:
ArrayList(int initSize=20):maxSize(initSize)
{
t=new T[initSize];
}
void insert(T t,int position);
};
#include "test.cpp" //包含cpp文件
#endif //TEST_H



test.cpp

#ifndef TEST_CPP
#define TEST_CPP
#include "test.h"
template<class T>
void ArrayList<T>::insert(T t,int position)//这里是T
{
cout << "ArrayList" << endl;
} ;
#endif //TEST_CPP


testTest.cpp

#include "iostream"
#include "test.h"
using namespace std;
int main()
{
int a=0;//初始化!!!
List<int> *l=new ArrayList<int>;
l->insert(a,5);
return 0;
}


以上代码VS 2008编译通过。还有一种编译模型时是分别编译模型,但是并非所有的编译器都实现了,但是上面所说的包含编译模型是所有编译器都实现了的。
Sou2012 2009-05-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 eatsweetpotato 的回复:]
模板的要求,须将类中函数定义与类定义放在一起
[/Quote]

现在大多数编译器都不支持模板的声明和定义不在一起
wenning111 2009-05-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kolige 的回复:]
我没有建工程,直接使用不行吗?
[/Quote]
不行,因为编译器不会自动找H文件的实现cpp文件
所以这种情况下cpp文件不会被编译
arong1234 2009-05-28
  • 打赏
  • 举报
回复
非模板情况下你必须把两个cpp文件生成的目标文件都链接起来

[Quote=引用 5 楼 yanghehong 的回复:]
引用 3 楼 kolige 的回复:
可是我把模版去掉,写成非模版也不行,同样出错啊


恩,包含了头文件,所以编译没问题。
而test.cpp生成的库没被包含在工程中,所以连接的时候找不到实现:undefined reference ...

没用过CFREE


- 千里孤行
[/Quote]
kolige 2009-05-28
  • 打赏
  • 举报
回复
我没有建工程,直接使用不行吗?
yanghehong 2009-05-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kolige 的回复:]
可是我把模版去掉,写成非模版也不行,同样出错啊
[/Quote]

恩,包含了头文件,所以编译没问题。
而test.cpp生成的库没被包含在工程中,所以连接的时候找不到实现:undefined reference ...

没用过CFREE


- 千里孤行
kolige 2009-05-28
  • 打赏
  • 举报
回复
没有人遇到过这个问题?
kolige 2009-05-28
  • 打赏
  • 举报
回复
可是我把模版去掉,写成非模版也不行,同样出错啊
eatsweetpotato 2009-05-28
  • 打赏
  • 举报
回复
模板的要求,须将类中函数定义与类定义放在一起
kolige 2009-05-28
  • 打赏
  • 举报
回复
有没有人来帮帮忙啊
yanghehong 2009-05-28
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 kolige 的回复:]
谢谢,找到问题答案了。

总结一下,并不需要建立工程(起码CFREE里面是)。原因是10楼所说的。
[/Quote]

:) 我说没包含在工程里意思只是说 没有连接进去。
不过无所谓了,你又不是做开发,没什么好讨论的


- 千里孤行
kolige 2009-05-28
  • 打赏
  • 举报
回复
谢谢,找到问题答案了。

总结一下,并不需要建立工程(起码CFREE里面是)。原因是10楼所说的。

64,640

社区成员

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

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