深入探讨vc下C++模板编译模型

写过模板的朋友也许知道,一个模板程序,当编译器看到模板定义时并不立即产生代码,只有在我们用到模板,并对其实例化的时候,才会产生特定的实例。此时,编译器就要访问定义模板的源代码了。如果源代码不可访问,当然,编译器会报错的。记得我初学的时候,采用的是直接将声明和实现全部放在一个.h里面这个方法。但是,有时候我们确实想在.h文件中声明,在CPP文件中实现,从而实现文件分离。那么下面我就写写一般模板函数,模板类,模板特化的文件分离,我自己的心得。

         在《C++primer》 中讲解了C++ 编译模板代码的两种模型 :(1)包含编译  (2)分别编译

(1)包含编译模型:可以通过在声明函数模板或类模板的头文件中添加一条#include指示使定义可用,从而引入包含相关定义的源文件


// header file utlities.h
#ifndef UTLITIES_H
#define UTLITIES_H
template <class T> int compare(const T&, const T&);
......
#include "utilities.cpp"
#endif
//implementation file utlities.cpp
template <class T> int compare(const T &v1,const T &v2)
{
  //implemente
  ......
}

        这一策略,实现了头文件和源文件的分离

(2)分别编译: 在分别编译模式下,函数模板的声明被放在头文件中。在这种模式下,函数模板声明和定义的组织方式与程序中的非内联函数的声明和定义组织方式相同。分别编译模型 只是在使用了关键字"export"来告诉编译器模板定义在哪里引用.

如果在头文件类声明中使用了export,则该头文件只能被源文件使用一次;如果在实现文件中使用了export,有下面两种用法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值