C++ 非模板类中的模板函数-H和CPP文件之间的划分
我(并且已经有很长一段时间)的印象是,您必须在.h文件中完全定义所有模板函数,以避免由于模板编译过程(非C++11)而出现多个定义错误 我正在阅读一位同事的代码,他有一个非模板类,其中声明了一个模板函数,他将函数声明与函数定义(在H中声明,在CPP中定义)分开。令我惊讶的是,它编译得很好C++ 非模板类中的模板函数-H和CPP文件之间的划分,c++,templates,C++,Templates,我(并且已经有很长一段时间)的印象是,您必须在.h文件中完全定义所有模板函数,以避免由于模板编译过程(非C++11)而出现多个定义错误 我正在阅读一位同事的代码,他有一个非模板类,其中声明了一个模板函数,他将函数声明与函数定义(在H中声明,在CPP中定义)分开。令我惊讶的是,它编译得很好 非模板类中的模板函数的编译方式与模板类中的函数的编译方式有区别吗?有人能解释一下这种区别是什么,或者我在哪里会感到困惑吗?有趣的一点是如何以及何时实例化模板。如果可以在链接时找到实例化,则模板定义不需要在头文件
非模板类中的模板函数的编译方式与模板类中的函数的编译方式有区别吗?有人能解释一下这种区别是什么,或者我在哪里会感到困惑吗?有趣的一点是如何以及何时实例化模板。如果可以在链接时找到实例化,则模板定义不需要在头文件中可见 有时,显式实例化的原因如下:
- 标题:
struct X { // function template _declaration_ template <typename T> void test(const T&); };
struct X{ //函数模板声明_ 模板无效测试(常数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&);
#包括“X.h” //函数模板\u定义\u: 模板 void X::test(常数T&) { } //显式函数模板实例化: 模板X::测试(常量int&); 模板X::test(const std::string&);
使用此示例,除非在其他翻译单元中使用模板的未实例化定义,否则链接将成功在命名空间或类范围中定义的函数模板之间没有区别。是否在类模板内也无关紧要。重要的是,在项目中的某个时刻,任何使用过的函数模板(无论是成员还是非成员)都会被实例化。让我们看一下不同的情况:
我上周末写了一篇关于这个主题的文章。他是否从自己的CPP之外调用了模板函数?在这个例子中,他没有-这会对情况产生什么影响?