关于模板类的编译连接问题
当将模板类的申明和实现分别写在 相应的.h和.cpp中的时候
调用模板类的成员函数会发生连接错误,报告找不到这个成员函数
例:
// File : template.h
template <class T>
class Test
{
public:
void func(T& t);
};
// File : template.cpp
template <class T>
void Test<T>::func(T& t)
{
cout << "Test::func\n";
}
// File : main.cpp
int main(int argc, char *argv[])
{
Test t;
t.func();
}
编译环境:
OS : linux2.4
Compiler : gcc
编译过程:
gcc -c -o template.o template.cpp
gcc -c -o main.o main.cpp
gcc -lstdc++ -o template template.o main.o
结果出现
link error
undefined Test<T>::func()
请问各位在用到template时出现过这种情况吗
发言者有分。
问题点数:100、回复次数:7Top
1 楼kenryHuang(冷的时候我想死)回复于 2003-09-04 19:42:48 得分 0
另外,如果将template.cpp中的函数func定义放在template.h中,则没有任何问题。Top
2 楼kenryHuang(冷的时候我想死)回复于 2003-09-04 19:49:00 得分 0
文件template.cpp 和main.cpp 都有
#include "template.h"
main.cpp中还有#include <iostream>
语法上是没有任何问题的,编译也通过了,请不要在这个上面找原因Top
3 楼aflyinghorse()回复于 2003-09-04 20:03:31 得分 40
将template.cpp中的函数func定义放在template.h
这是模板的包含编译模式,对现在的编译器来说需要这样做
因为大多现在的C++编译器不支持关键字export,所以也就不能把
模板的声明和定义分开,而应该把他们放在头文件里。Top
4 楼sevecol(sevecol.blogone.net)回复于 2003-09-04 20:04:56 得分 60
现在的大部分编译器都需要将定义和实现放在一起.除非编译器支持exportTop
5 楼sevecol(sevecol.blogone.net)回复于 2003-09-04 20:05:38 得分 0
现在的大部分编译器都需要将定义和实现放在一起.除非编译器支持exportTop
6 楼kenryHuang(冷的时候我想死)回复于 2003-09-04 20:07:07 得分 0
如果支持export应该怎么做,以前C++ primer中好像提到过,不过我忘了Top
7 楼sevecol(sevecol.blogone.net)回复于 2003-09-04 20:14:58 得分 0
.h
template<typename T>
T play();
.cpp
export template<typename T>
T play()
{
return T();
};Top
8 楼kenryHuang(冷的时候我想死)回复于 2003-09-04 20:43:04 得分 0
gcc 好像不支持,惨。。。Top




