1. 关键词export
前面两篇文章都可以有效解决模板实例化,而且完全符合C++标准。但是C++标准还提供了另一种机制,可以导出(export)一个template。这种机制称为C++模板的分离式模型separation model。
原则上,export的使用相当容易:将template定义于某文件中,并将定义式及其所有非定义声明nondefinition加上关键词export。以先前出现的例子而言,这会导致如下的函数模板function template声明:
//myfirst.hpp
#ifndef MYFIRST_HPP
#define MYFIRST_HPP
export
template <typename T>
void print_typeof (T const&)
#endif
exported templates 可被直接拿来使用,不需要现场看到template定义文件。换言之,template的使用和定义可以分隔于两个不同的编译单元。
如果不加export,原先程序代码会引发链接错误,新版本可以顺利链接。
由于本环境是C++11,不能支持export模板方式,报如下错误,
关键词export适用于function template, class templates成员函数、。
注意两点:
1)inline函数不能导出 ;
2)export不能与inline合用,且export总是在关键词template之前。
2. 分离式模型Separation Model的局限
首先,只有一家公司支持export;
其次,export不支持源码级管理工具管理,依存关系的工具
最后,导致令人吃惊的语义问题,后面详细解释。
3. 为分离式模型预做准备
可以用预处理指令(preprocessor directive)。在置入式和分离式模型之间切换:
//如果定义了USE_EXPORT,就使用关键词export
#if defined(USE_EXPORT)
#define EXPORT export
#else
#define EXPORT
#endif