c++ - 非模板类中的模板函数——H和CPP文件的划分

标签 c++ templates

我曾经(并且已经有很长一段时间)的印象是您必须在 .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/

相关文章:

c++ - 模板推导指南中的附加类型

C++ 部分模板特化

c++ - 具有可变数量的已知类型的参数的函数,c++ 11方式

python - 在 Python 扩展中启动线程

c++ - opencv triangulatePoints,奇怪的结果

c++ - 如何使用 fgets 获取整行

c++ - 在c++中包含与项目目录相关的文件

C++模板交叉定义

c++ - 根据模板参数生成不同大小的初始化列表

php - WooCommerce 中生成的项目(产品)表在哪里