 |
|
C++对模板的分离式编译问题的解答 |
出处:PConline 责任编辑:ljx |
[03-10-27 15:55]
| 作者:pongba/CSDN
| -
也就是说,如果你在main.cpp文件中没有调用过f,f也就得不到具现,从而main.obj中也就没有关于f的任意一行二进制代码!!如果你这样调用了:
f(10); //f得以具现化出来
f(10.0); //f得以具现化出来
这样main.obj中也就有了f,f两个函数的二进制代码段。以此类推。
然而具现化要求编译器知道模板的定义,不是吗?
看下面的例子:[将模板和它的实现分离]
//-------------test.h----------------//
template
class A
{
public:
void f(); //这里只是个声明
};
//---------------test.cpp-------------//
#include”test.h”
template
void A::f() //模板的实现,但注意:不是具现
{
…//do something
}
//---------------main.cpp---------------//
#include”test.h”
int main()
{
A a;
a.f(); //编译器在这里并不知道A::f的定义,因为它不在test.h里面
//于是编译器只好寄希望于连接器,希望它能够在其他.obj里面找到
//A::f的实现体,在本例中就是test.obj,然而,后者中真有A::f的
//二进制代码吗?NO!!!因为C++标准明确表示,当一个模板不被用到的时
//侯它就不该被具现出来,test.cpp中用到了A::f了吗?没有!!所以实
//际上test.cpp编译出来的test.obj文件中关于A::f的一行二进制代码也没有
//于是连接器就傻眼了,只好给出一个连接错误
ad
相关文章:
VC++实现拨号上网程序详解
利用C++Builder让软件字幕动起来
微软推出嵌入式Visual C++ 4.0 SP2
| |  | -
|  |