模板编译模型

     当编译器看到模板定义的时候,它不立即产生代码。只有在看到用到模板时,如调用了函数模板或定义了类模板的对象的时候,编译器才产生特定类型的模板实例。

     一般而言,当调用函数的时候,编译器只需要看到函数的声明。类似地,定义类类型的对象时,类定义必须可用但成员函数的定义不是必须存在的。因此,应该将类定义和函数声明放在头文件中,儿普通函数和类成员函数的定义放在源文件中。

     模板则不同:要进行实例化,编译器必须能够访问定义模板的代码。当调用函数模板或类模板成员函数的时候,编译器需要函数定义,需要那些通常放在源文件中的代码。

   标准C++为编译模板定义了两种模型没在两种模型中,构造程序的方式很大程度上是相似的,类定义和函数声明放在头文件中,而函数定义和成员定义放在源文件中。两种模型的不同之处在于,编译器怎样使用来自源文件的定义。

    包含编译模型

    编译器必须看到用到的所有模板的定义,一般而言可以通过在声明函数模板或类模板的头文件中添加一条#include 只是使定义可用。该#include引入了包含相关定义的源文件:

   // Queue.h

  #ifndef UTLITIES_h
  #define UTLITIES_h

    template<typename type> class Queue;
    // other declarations

 

     #include "Queue.cpp"
    #endif

 

   // Queue.cpp

  #ifndef UTLITIES_C
  #define UTLITIES_C
  #include "Queue.h"

   template<typename type>.......

  ......

 

   #endif

    这一策略使我们能够保持头文件和实现文件的分离,但是需要保证编译器在编译使用模板的代码时能够看到两种文件。

分别编译模型

    编译器会为我们跟踪相关的模板定义,但是,我们必须让编译器知道要记住给定的模板定义,可以使用export关键字。export关键字能够使我们给定的定义可能会在其他文件中产生实例化。在一个程序中,一个模板只能定义为导出一次。编译器在需要产生这些实例化时计算出怎样定位模板定义,export关键字不必在模板声明中出现。

    一般在函数模板的定义中指明函数模板为导出的,这是通过在关键字template之前包含export关键字而实现的。

    对类模板通常类声明放在头文件中,头文件中的类定义体不应该使用关键字export,如果在头文件中使用了export,则改头文件只能被程序中的一个文件只用

   应该在类的实现文件中使用export

 

 

  VS2008 可以使用包含编译模型,暂不能使用分别编译模型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值