1.4.1 什么是外名模板
外名模板提倡将模板的声明与实现分别写在头文件与主文件内,如此实现的模板需要在模板声明前加关键字export以标记为外名模板,如例1.8所示。
例1.8
- // ======================================
- // 文件名:square.hpp
- export template<typename T>
- T square(T const &v);
-
- // ======================================
- // 文件名:square.cpp
- #include "square.hpp"
- export template<typename T>
- T square(T const &v) {return v * v;}
-
- // ======================================
- // 文件名:main.cpp
- #include "square.hpp"
- #include <iostream>
-
- int main()
- {
- std::cout << square(0.1f) << std::endl;
- }
例1.8中有一个函数模板square,其作用是返回给定参数的平方值。该函数模板的声明和实现分别放在头文件square.hpp和主文件square.cpp中,并且被声明为一个外名模板,即声明以关键字export开头后接正常声明或实现。在文件main.cpp中调用该函数模板计算一个浮点数的平方并打印。
与通常的模板用法不同,在main.cpp中只是将square的声明包含进来,所以在编译main.cpp时,编译器无从得知模板如何实现,只好留一个函数调用以待在链接阶段可以找到对应函数链接。另外,文件square.cpp中只含有一个模板实现而无模板调用,一般编译器在编译此文件时不会生成任何函数实例代码。而在链接时,会因为无法找到main.cpp中所需要的square<float>模板实例而报错。例如用GCC编译时情况大抵如此,并且GCC还会给出一个“不支持export”的警告。