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. OO.A.D.P

    OO/A/D/P 对象和类 三大特征 对象: 对象是面向对象语言的一个极为重要的特点,所有的面向对象语言都有对象的共性. 1. 职责(单一) 2. 属性(数据.可改变的) 3. 函数(行为.方法.业务 ...

  2. transfromjs动画效果

    记得以前facebook做过一款HTML5游戏.开场动画是一块软体类似豆腐的东西一起摇摆.类似的效果如下面的gif所示: facebook当时使用的是createjs下的子项目easeljs和twee ...

  3. 分享一个web存储方法

    https://github.com/zhujiasheng/jquery-cookie/blob/master/src/jquery.cookie.js https://github.com/WQT ...

  4. PowerDesigner反向工程PostgreSQL数据库

    1. 环境准备: a)         安装PowerDesigner,以PowerDesigner15.1为例 b)         安装java jdk,以jdk-7-windows-i586为例 ...

  5. JQuery Mobile入门——设置后退按钮文字(转)

    http://www.tuicool.com/articles/AZnYVz JQuery Mobile入门——设置后退按钮文字 时间 2013-01-09 20:24:28  CSDN博客原文  h ...

  6. SpringMVC的controller方法上若需要参数 如User

    Bean: public class User {    private String name;     private String password;    public String getN ...

  7. POJ1236 network of schools

    100个学校,有单向网络连接,从而分享软件. 问题一:几个学校得到软件就可使所有学校都得到? 问题二:再加几条单向网络可以使得"任意学校得到软件,就可使得所有学校都有软件"? -- ...

  8. MSSQLSERVER服务无法启动的解决方案

    MSSQLSERVER服务无法启动的解决方案 有时候sqlserver无法启动了,原因是mssqlserver服务没有启动,当你手动启动时,又出现服务无法响应的可恶错误提示... 笔者“有幸”遇到了, ...

  9. generator class 的含义

    native有天生的,本土的,也就是说生来就有的, 那也就是说自动生成,不需要人工来帮忙或者管控的. 而assigned是指指定的,分配的, 如果你不赋予他甚麼东西,那麼他是不能实现的. 需要人工,自 ...

  10. Ajax 知识点

    AJAX 即"Asynchronous Javascript And XML"(异步JavaScript和XML) Ajax 不是某种编程语言,只是一种在无需重新加载整个网页的情况 ...