请教一个在C++中用模板的问题

lifanxi 2001-12-19 09:23:21
虽然用过很长一段时间C++,但一直没有用过它的模版(template),最近试着用了用,却发现了一个问题,请高手指点。谢谢!

比如我做下面这样一个程序(当然我现在只建了个架子,没有任何用途):
template< class NODETYPE >
class List {
public:
List();
~List();
private:
NODETYPE data;
};
template < class NODETYPE >
List<NODETYPE>::List()
{
}
template < class NODETYPE >
List<NODETYPE>::~List()
{
}
void main()
{
List <int> ll;
}
毫无疑问,编译、链接、运行顺利通过。
下面我把它分成三个文件,即主程序一个文件,List类用两个文件,一个头文件,一个实现文件。
如下:
linklist.h
#if !defined(LINKLIST_H_INCLUDED_)
#define LINKLIST_H_INCLUDED_
template< class NODETYPE >
class List {
public:
List();
~List();
private:
NODETYPE data;
};
#endif

linklist.cpp
#include "linklist.h"
template < class NODETYPE >
List<NODETYPE>::List()
{
}
template < class NODETYPE >
List<NODETYPE>::~List()
{
}

main.cpp
#include "linklist.h"
void main()
{
List <int> ll;
}
我个人感觉是没有问题,可是在VC6.0、VC7.0、BC3.1上链接均没有通过,所以我觉得一定是我哪里出错了。请高手指点!谢谢!
...全文
65 点赞 收藏 7
写回复
7 条回复
Last_Dodo 2001年12月20日
Sorry for my broken english. I was doing two thing at the same time (no, I am not looking for excuse of my bad english ^_^ ). Looks like I will have to type in chinese (I am very bad in typing chinese, slower than my grandma).
回复 点赞
北极猩猩 2001年12月20日
我们知道,.cpp是要被编译器编译成.obj文件的,但是很明显模板的实现,在被实例化之前是无法单独被编译的(因为编译器没有模板参数类型的信息),所以直接将模板的声明与实现分开在理论上也是行不通的,为此C++专门定义了export关键字来实现。
因此,你的程序应该是这样:
//linklist.h

#if !defined(LINKLIST_H_INCLUDED_)
#define LINKLIST_H_INCLUDED_
template< class NODETYPE >
class List {
public:
List();
~List();
private:
NODETYPE data;
};
#endif

//linklist.cpp
#include "linklist.h"
export template < class NODETYPE >
List<NODETYPE>::List()
{
}
export template < class NODETYPE >
List<NODETYPE>::~List()
{
}

不过,许多C++编译器都不支持这一点,所以对付模板的最常用方式就是将它的声明和实现放在一个头文件中。
回复 点赞
winmain 2001年12月20日
List类用一个头文件,主程序用cpp文件这样分成两个文件就可以了。这是编译器的问题。
回复 点赞
dis_covery 2001年12月20日
Please use intel c++ compiler
回复 点赞
lmfree 2001年12月20日
楼上的朋友,sorry,看来我应该拜你为师,而不是交朋友!!!
回复 点赞
GuanXP 2001年12月20日
很多C++编译器不支持模板头和实现分开.是编译器的错,你没有.
回复 点赞
Last_Dodo 2001年12月20日
Different compiler handle template instantiation differently. You need to check your compiler document. I don't have any C++ compiler on PC. So, I could not help you directly. On Sun, CC 4.2 and older does compile time instantiation and it knows where the instantiated code. It will link in the module transparently. On older HP UX CC, you have to name the file the same as the class (it does link time instantiation. It uses the class name to find the implementation file. That is why they require the file name is the same as the class name). On older IBM xlC, you have to name the implementation file with lower case 'c' as the extended file name. All them knows how to find the repository of the instantiated file and allows user to set the repository directary. So, go check your compiler document. You will find it. If you don't have the document, try to change the file name to be the same as the class name.

Above comment is based on the assumption that your compile and link line are correct.
回复 点赞
发动态
发帖子
C语言
创建于2007-09-28

3.2w+

社区成员

24.0w+

社区内容

C语言相关问题讨论
社区公告
暂无公告