模板类定义中的有关问题
模板类定义中的问题
我在1个.h文件中定义了一个模板类,在1个.cpp文件中是类函数的实现,在1个文件中编写了主函数
如下
//der.h文件
#include <iostream>
using namespace std;
template <typename T> class tempcla{
T a;
public:
T geta();
tempcla(T n);
};
//der.cpp文件
#include <iostream>
#include "der.h "
using namespace std;
template <typename T> tempcla <T> ::tempcla(T n){
a=n;
}
template <typename T> T tempcla <T> ::geta(){
return a;
}
//main.cpp文件
#include <iostream>
#include "der.h "
using namespace std;
void main(){
tempcla <int> c1(5);
cout < <c1.geta() < <endl;
}
为何连接时总是出现如下错误提示。而将3个文件合并成一个.cpp文件,则没有错误一切正常。请各位行家指教。
main.obj : error LNK2001: unresolved external symbol "public: int __thiscall tempcla <int> ::geta(void) " (?geta@?$tempcla@H@@QAEHXZ)
main.obj : error LNK2001: unresolved external symbol "public: __thiscall tempcla <int> ::tempcla <int> (int) " (??0?$tempcla@H@@QAE@H@Z)
Debug/derive.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.
derive.exe - 3 error(s), 0 warning(s)
------解决方案--------------------
模板不允许分离编译,起码目前还没有支持模板分离编译的编译器
------解决方案--------------------
模板的所有东西都应该写在一个.h里。
具体就不要去深究了。
------解决方案--------------------
同上, VC_MFC里面是你贴的吧,这边也贴了啊,:)
------解决方案--------------------
模板不允许分离编译
学习。。。。
------解决方案--------------------
export关键字支持分离编译,C++标准,编译器不支持
------解决方案--------------------
说白了就是
template <typename T> tempcla <T> ::tempcla(T n){
a=n;
}
template <typename T> T tempcla <T> ::geta(){
return a;
}
这些动动放到 .h文件里去
------解决方案--------------------
在头文件里的最后把实现的文件包进去就可以了。
编译错误,是因为函数体没有具现,也就是说程序里根本就没有这个函数的代码。
当编译器遇到tempcla <int> c1(5);
它没有看到定义也就不会用int具现这个类,而编译器就假设这个定义在别的地方,就产生一个对它的引用,到连接的时候再决定这个引用指了什么东西。而当编译器遇到tempcla的定义时,又不知道用什么类型来具现它,就不会对它作处理。这样,刚才那个引用就找不到它所要指的东西,也就出现了上面的连接错误。
我在1个.h文件中定义了一个模板类,在1个.cpp文件中是类函数的实现,在1个文件中编写了主函数
如下
//der.h文件
#include <iostream>
using namespace std;
template <typename T> class tempcla{
T a;
public:
T geta();
tempcla(T n);
};
//der.cpp文件
#include <iostream>
#include "der.h "
using namespace std;
template <typename T> tempcla <T> ::tempcla(T n){
a=n;
}
template <typename T> T tempcla <T> ::geta(){
return a;
}
//main.cpp文件
#include <iostream>
#include "der.h "
using namespace std;
void main(){
tempcla <int> c1(5);
cout < <c1.geta() < <endl;
}
为何连接时总是出现如下错误提示。而将3个文件合并成一个.cpp文件,则没有错误一切正常。请各位行家指教。
main.obj : error LNK2001: unresolved external symbol "public: int __thiscall tempcla <int> ::geta(void) " (?geta@?$tempcla@H@@QAEHXZ)
main.obj : error LNK2001: unresolved external symbol "public: __thiscall tempcla <int> ::tempcla <int> (int) " (??0?$tempcla@H@@QAE@H@Z)
Debug/derive.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.
derive.exe - 3 error(s), 0 warning(s)
------解决方案--------------------
模板不允许分离编译,起码目前还没有支持模板分离编译的编译器
------解决方案--------------------
模板的所有东西都应该写在一个.h里。
具体就不要去深究了。
------解决方案--------------------
同上, VC_MFC里面是你贴的吧,这边也贴了啊,:)
------解决方案--------------------
模板不允许分离编译
学习。。。。
------解决方案--------------------
export关键字支持分离编译,C++标准,编译器不支持
------解决方案--------------------
说白了就是
template <typename T> tempcla <T> ::tempcla(T n){
a=n;
}
template <typename T> T tempcla <T> ::geta(){
return a;
}
这些动动放到 .h文件里去
------解决方案--------------------
在头文件里的最后把实现的文件包进去就可以了。
编译错误,是因为函数体没有具现,也就是说程序里根本就没有这个函数的代码。
当编译器遇到tempcla <int> c1(5);
它没有看到定义也就不会用int具现这个类,而编译器就假设这个定义在别的地方,就产生一个对它的引用,到连接的时候再决定这个引用指了什么东西。而当编译器遇到tempcla的定义时,又不知道用什么类型来具现它,就不会对它作处理。这样,刚才那个引用就找不到它所要指的东西,也就出现了上面的连接错误。