背景:项目中需要实现一个小范围应用的内存池,所谓小范围主要是针对两种特定类型而言。除类型之外,其他操作一样。
于是使用C++中的模板实现。
问题:在mempool.h中定义各个模板类,然后再在mempool.cpp中实现模板类的成员函数。生成解决方案,出现链接错误。
解决:标准C++为编译模板代码定义了两种模型:1) 包含编译模型(includsion compilation model);2) 分别编译模型(separate compilation model)。其中分别编译模型主要使用的是export关键字,但是目前VS与GCC都不支持——在VS2010与DEV C++中测试。于是,采用包含编译的方式解决——在头文件中直接定义模板类的成员函数,或者在mempool.h中#include "mempool.cpp",其中mempool.cpp为类成员函数的实现。
>typename与class的区别
>>两关键字具有相同的含义,可以互换使用,也可以同时出现在模板形参表中
>>前者可能比后者更加直观点
>>前者是作为标准C++的组成部分加入到C++中,旧的程序更有可能只用class
>inline函数模板:
>>template <class T>inline T func( const T&);
>>“template <模板形参>” 放最前面
>编译器使用用户提供的实际特定类型代替模板形参,重新编写模板(类或函数)。
参考文献
《C++ Primer》中文版(第4版)