c++ 模版函数的定义和实现必须放在一个文件中

今天使用模版函数,遇到一个问题。

当我定义一个类,并且将它的一个成员函数定义为模版类型时,需要将该模版函数的实现与该类放在一个文件中。

比如在a.h中定义了class a:

[html]  view plain copy
  1. class a  
  2. {  
  3.     ...  
  4.     template<typename T> a(const T& t);     
  5. };  

其中函数使用了模版,那么该模版函数的实现需要也放在a.h中,如果放在a.cpp中,那么在使用时可能会出现

error LNK 2019 unresolved external symbol .................... referenced in function


的问题。


原因:

引用C++primer的话:C++支持两种模板编译模式包含模式Inclusion   Model   和分离模式Separation   Model

1. 包含编译模式

    在包含编译模式下我们在每个模板被实例化的文件中包含函数模板的定义并且往往把定义放在头文件中像对内联函数所做的那样

2. 分离编译模式

    在分离编译模式下函数模板的声明被放在头文件中 ,  在模板定义中有一个关键字export,  关键字export   告诉编译器在生成被其他文件使用的函数模板实例时可能需要这个模板定义编译器必须保证在生成这些实例时该模板定义是可见的 , 关键字export   不需要出现在头文件的模板声明中, 分离模式使我们能够很好地将函数模板的接口同其实现分开进而组织好程序以便把函数模板的接口放到头文件中而把实现放在文本文件中, 但是并不是所有的编译器都支持分离模式, 即使支持也未必总能支持得很好, 支持分离模式需要更复杂的程序设计环境所以它们不能在所有C++编译器实现中提供. 

自己的理解: 现在的VC++编译器都不知道模板分离编译模式,所以我们还是好好的把定义与实现都放在一个文件中吧。

其实模板实现不能放在cpp文件中,主要就是CPP在c++编译期间不能决定模板参数的类型,所以不能生成模板函数的实例,所以他会把模板类型带到链接期间,如果这个期间有函数调用了该实例,这个时候由于没有把模板实例到特定类型,就会导致编译错误。但是如果不调用该模板函数,那么是不会出现错误的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值