我曾经(并且已经有很长一段时间)的印象是您必须在 .h 文件中完全定义所有模板函数,以避免由于模板编译过程(非 C++11)而发生的多重定义错误).
我正在阅读一位同事的代码,他有一个非模板类,其中声明了一个模板函数,他将函数声明与函数定义(在 H 中声明,在 CPP 中定义)分开。出乎我的意料,它编译并运行良好。
非模板类中的模板函数的编译方式与模板类中的函数的编译方式有区别吗?有人可以解释一下这种区别是什么或者我可能会感到困惑的地方吗?
最佳答案
有趣的一点是模板如何以及何时被实例化。如果可以在链接时找到实例化,则模板定义不需要在头文件中可见。
有时,显式实例化是这样的:
标题:
struct X { // function template _declaration_ template <typename T> void test(const T&); };
cpp:
#include "X.h" // function template _definition_: template <typename T> void X::test(const T&) { } // explicit function template _instantiation(s)_: template X::test<int>(const int&); template X::test<std::string>(const std::string&);
使用此示例,除非在其他翻译单元中使用模板的未实例化定义,否则链接将成功
关于c++ - 非模板类中的模板函数——H和CPP文件的划分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8995663/