C++ 模板放置在 .h 文件中的一个原因

一直没有对 C++ 模板做过系统的学习,对于 STL 模板类或者函数,都是查查文档就直接使用。不过在翻开 STL 代码的时候,都曾注意到那些模板是放置在.h文件中的,至于为何,却是没有去想过。

今天在编写一个动态连接库的时候,才明白其中的原因。比如库里面有下面模板类

 

template <typename Data>

class concurrent_queue

{

public:

  concurrent_queue(unsigned capacity);

  ~concurrent_queue();

 

  bool push(const Data&);

  void pop(Data&, int timeout = -1);

 

...

};


 

开始我习惯性的将这个模板类的实现放在 .cpp 文件里面,编译出来的 .so 都正常。但是在使用这个模板的时候,就出现问题。

 

比如

 

class Message

{

...

}

 

concurrent_queue<Message *> message_queue;

 

Message * pMsg = new Message();

message_queue.push(pMsg);

...


 

那么在连接上面的 .so 时,会出现下面的错误

XXX.so: undefined reference to `concurrent_queue<Message*>::push(const Message* &)'

那是因为编译器无法生成对应 Message *的实现,如果将模板类全部放置在 .h 文件里面,那么就不存在这个问题了。

 

模板编程对于代码重用确实有很大的实用性,不亚于继承和封装。

 

C++ Templates Tutorial http://www.iis.sinica.edu.tw/~kathy/vcstl/templates.htm

The declarations and definitions of the class template member functions should all be in the same header file.

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值