-
您现在的位置:网络学院 > 开发特区 > 开发语言 > C++Builder
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
IT培训十大热门文章
·学好VC++的十大良好习惯
·传奇程序员:Perl的乐趣
·linux入门必读文章
·软件开发高手是这样炼成的
·在职读工程硕士考有变!
·追击热门IT认证:CCIE
·追击热门IT认证:RHCE
·获IT认证后薪水能涨多少?
·IT人必读的优秀书籍集锦
·中专生能进大型IT公司吗?

内容搜索 
高级搜索
本栏今日焦点