1、置入式模型

链接错误:

大多数非模板程序代码的组织如下:A,类声明在头文件中; B:全局变量和非inline函数在cpp文件中定义

但是,如果模板程序也这样组织,则会出错。原因在于:函数模板的定义没有被实体化。为了实例化一个模板,编译器必须知道以哪一份定义以及哪些参数对其进行实例化。如果把声明放在h文件,定义放在cpp文件,这编译器无法知道这些信息。因此当编译器发现调用该函数模板时,无法找到其定义,无法以具体的数据类型来实体化该模板函数。于是编译器假设该函数模板的定义位于其他某处,因而只生成一个队它的引用,并将这个引用所指定的定义由链接器去决定。另一方面,当编译器调用该函数模板时,它又无法决定以哪个类型来实例化该定义。

就像处理inline函数一样,解决该问题的办法是:

A、把template定义放到H头文件中,这种方法叫作置入式模型。非inline模板函数并不在调用时被展开。每当他们被实体化时,编译器便从新创建一份函数式拷贝。由于这个过程是自动化,因此在同一个cpp文件中可能存在一个模板的两个两个实体化拷贝,而某些链接器会因为发现两份拷贝会报错

B、将定义的cpp文件包含到h文件末尾,即在h文件末尾添加:#include " *.cpp"

C、也可以在用到该模板的每个cpp中添加:#include " *.cpp"

2、显示具现化

显示具现化由两部分组成:A、首先是关键字template;B、模板参数已经被全部替换后的函数声明。对于成员函数或者静态成员函数都可以采用该类方法来实例化。

如:template MyClass<int>::MyClass();//明确地以int对MyClass<>类进行实例化

template int const & MyMax(int const & a, int const &b);//对函数模板MyMax以int实例化

可以明确要求编译器对类以某种元素显示实例化:template class MyClass<double>;

对某个成员函数以某种类型实例化:template MyClass<string>::MyClass();

template void MyClass<string>::push(string const & );

但是不能将已经显示实例化的成员函数实例化为其他类型函数:template MyClass<double>::MyClass();

在程序中,每个物体只能有一份显示实例化。

置入式模型inclusion model和显示具现化的更多相关文章

  1. 分离式模型separation model

    1.关键字export 在头文件中定义模板,并且在模板的定义以及声明前添加关键字export. exported 模板可以直接使用,不需要看到该模板定义.模板的使用和定义可以分割于两个不同的编译单元. ...

  2. 产生式模型(生成式模型)与判别式模型<转载>

    转自http://dongzipnf.blog.sohu.com/189983746.html 产生式模型与判别式模型 产生式模型(Generative Model)与判别式模型(Discrimiti ...

  3. 如何让django模型中的字段和model名显示为中文

    如何让django模型中的字段和model名显示为中文:在模型中加入class Meta即可 class People(models.Model): name = models.CharField(n ...

  4. 模型(Model)– ASP.NET MVC 4 系列

           为 MVC Music Store 建模        在 Models 目录中为专辑.艺术家.流派建模: public class Album { public virtual int ...

  5. Django模型(model)系统

    Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...

  6. 读书笔记_Effective_C++_条款十七:以独立语句将new产生的对象置入智能指针

    int get_int(); void f(shared_ptr<int> a, int); //下面调用 f(new int(3), get_int());//如果是类而不是int就可以 ...

  7. 以独立的语句将new对象置入智能指针

    以独立的语句将newed对象置入智能指针: processWidget(std::tr1::share_ptr<Widget>(new Widget) , priority()); 我们在 ...

  8. 盒子模型(Box Model)

    盒子模型(Box Model) ■ 盒子模型——概念 在网页设计中常用的属性名:内容(content),填充(padding),边框(border),边界(margin),CSS 盒子模式都具备这些属 ...

  9. 使用 Jackson 树模型(tree model) API 处理 JSON

    http://blog.csdn.net/gao1440156051/article/details/54091702 http://blog.csdn.net/u010003835/article/ ...

随机推荐

  1. postgres 批量更新内容

    在程序中遇到这样的需求, 数据库表格式如下 需要把批量更新status, 如name = fox 时, status = 1, name = boa 时,status = 2 .... 类似的 pos ...

  2. MFC对话框中显示BMP,JPG图片

    //************************************ // 方法说明:    显示JPG和GIF.BMP图片 // 参数说明:    CDC * pDC           设 ...

  3. Ptex源码学习笔记-1

    Ptex是Walt Disney Animation Studios开发的纹理映射工具.在看一个叫appleseed的渲染器时看到他支持这种纹理,所以就查看一下,发现比较轻量,所以就想趁此机会学习下. ...

  4. 数据转移发现font有问题

    本地正常 以为是mime.types没有 但是发现是存在的  然后根据提示百度了很久都没有解决 解决: 去字体官网下载改字体文件下来 上传到服务器 发现可以正常访问 说明不是服务器的问题 有个提示 i ...

  5. (十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  6. css中clip-path属性的运用

    今天看到一位同学的需求,要在一个div中加一个小尖尖,对话时发的图片,旁边这个三角是怎么实现与图片的颜色一致,效果如下: 当然,解决这个问题有各种奇淫巧技,现在我们来看一个css属性clip-path ...

  7. Html登录表单阻止自动填充

    设置属性 autocomplete="off" 阻止浏览器从cache获取数据填充登录表单. <input type="text" name=" ...

  8. js-我理解的闭包

    一:什么是闭包 <JS高级程序设计>指出:闭包是指有有权访问另一个函数作用域中变量的函数. 二:闭包的使用 闭包的常见的创建方式是 子函数嵌套在父函数的内部,这样,子函数就可以访问父函数中 ...

  9. redis对比其余数据库

    Redis属于常见的NoSQL数据库或者说非关系数据库:Redis不使用表,她的数据库也不会预定义或者强制去要求用户对Redis存储的不同数据进行关联. 常见数据库对比: 和高性能键值缓存服务器mem ...

  10. 大批量GPS坐标转百度坐标

    一. 百度地图API大批量转换时有数量限制,一个一个转.  用到的方法接口    /**      源坐标 格式:经度,纬度;经度,纬度… 最多支持100个;      源坐标类型:默认为1,即GPS ...