1.4 尴尬的Export Template
实际上,除了将模板的声明与实现一同放在头文件中编译之外,C++(www.cppentry.com)标准(98版)还提供了另一种组织模板代码的方式——Export Template(暂且称为外名模板)。而定义与实现放在同一头文件中的模板可称为内名模板。
外名模板的作用在于使得函数模板(或者第2章讲到的类模板)代码可依照C/C++(www.cppentry.com)语言的习惯,将声明与实现分别放在头文件与主文件中。但是为了支持外名模板,需要在编译与链接之间增加额外处理,这也使得外名模板成为C++(www.cppentry.com)标准的争论热点之一。
支持者认为外名模板使得模板代码组织更加模块化,并且可以享受模板代码所带来的一系列好处,例如多个模板实例共用同一本地函数等。而反对者认为,既然内名模板也可以在大部分情况下很好地实现编译意图,再因为外名模板而对编译工具流程做改动则无异于削足适履。
而现实是,外名模板虽然写入C++(www.cppentry.com)98标准,但少有主流编译器支持。这使得外名模板成了镜花水月一般,看起来很美,但是考虑到代码要跨平台可移植等,很少有人会用。并且在最新的标准C++(www.cppentry.com)11中,外名模板也被排除在标准之外,代之以使用关键字extern声明来阻止编译器在本目标文件中生成某些模板实例。
虽然外名模板即将成为(短期内的)历史尘埃,也不妨对其稍做介绍,至少可以给我们提供另一种实现模板的思路。