• C++模板源代码的三种组织方式


    模板代码和非模板代码是有区别的,如果像非模板代码那样把模板的声明放在头文件.h中,把模板的定义放在源文件.cpp中,那么使用这个模板时会得到一个链接错误。这个错误的原因在于,模板的定义还没有被实例化。为了实例化一个模板,编译器必须知道哪一个定义应该被实例化以及使用什么样的模板参数来实例化。

    我们可以用以下三种方式来组织模板代码:

    1. 包含模型(Inclusion Modal)

    a. 把模板的定义包含进声明模板的头文件中,如果模板声明在头文件tmpl.h中,定义在tmpl.cpp中,那可以将#include "tmpl.cpp"添加到tmpl.h文件的末尾。
    b. 或者在每一个使用模板的C++文件中包含tmpl.cpp文件来达到目的。
    c. 当然也可以不用.cpp文件,把模板声明和定义放在同一个.h文件里。
    包含模型能够确保所有需要的模板都已经实例化,这是因为:当需要进行实例化的时候,C++编译系统会自动产生所对应的实例化体。

    2. 显示实例化(Explicit  Instantiation)

    显式实例化由关键字template和紧接其后的我们所需要实例化的实体(可以是类、函数、类成员函数等)的声明组成,而且该声明是一个已经用实参完全替换参数之后的声明。
    a. template const int& max(const int& a, const int& b); // 函数模板的显式实例化
    b. template class Array<char>; // 类模板的显式实例化
    c. template unsigned int Array<char>::GetSize(); // 模板成员函数的显式实例化

    3. 分离模型(Separation Modal)

    C++标准还给出了另一种机制来组织模板代码:导出模板(exporting template),这种机制通常也被称为C++模板的分离模型。
    分离模型只需在模板声明的.h文件里加export关键字,如:
    export template <typename T> void func(const T&);
    然而VC++编译器到目前为止并不支持分离模型。

  • 相关阅读:
    移动端性能优化动态加载JS、CSS
    右侧跟踪导航
    JQ+rotate插件实现图片旋转,兼容IE7+ CHROME等浏览器
    什么JSONP
    Web前端开发:什么是页面重回(repaints)与回流(reflow)
    javascript中的eval()函数应用以及要点
    SQL表值参数批量插入
    SQL SERVER 使用 OPENRORWSET(BULK)函数将txt文件中的数据批量插入表中(2)
    SQL SERVER 使用BULK Insert将txt文件中的数据批量插入表中(1)
    一个编程菜鸟的进阶之路(C/C++)
  • 原文地址:https://www.cnblogs.com/chogen/p/4582170.html
Copyright © 2020-2023  润新知