置入式模型inclusion model和显示具现化
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和显示具现化的更多相关文章
- 分离式模型separation model
1.关键字export 在头文件中定义模板,并且在模板的定义以及声明前添加关键字export. exported 模板可以直接使用,不需要看到该模板定义.模板的使用和定义可以分割于两个不同的编译单元. ...
- 产生式模型(生成式模型)与判别式模型<转载>
转自http://dongzipnf.blog.sohu.com/189983746.html 产生式模型与判别式模型 产生式模型(Generative Model)与判别式模型(Discrimiti ...
- 如何让django模型中的字段和model名显示为中文
如何让django模型中的字段和model名显示为中文:在模型中加入class Meta即可 class People(models.Model): name = models.CharField(n ...
- 模型(Model)– ASP.NET MVC 4 系列
为 MVC Music Store 建模 在 Models 目录中为专辑.艺术家.流派建模: public class Album { public virtual int ...
- Django模型(model)系统
Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...
- 读书笔记_Effective_C++_条款十七:以独立语句将new产生的对象置入智能指针
int get_int(); void f(shared_ptr<int> a, int); //下面调用 f(new int(3), get_int());//如果是类而不是int就可以 ...
- 以独立的语句将new对象置入智能指针
以独立的语句将newed对象置入智能指针: processWidget(std::tr1::share_ptr<Widget>(new Widget) , priority()); 我们在 ...
- 盒子模型(Box Model)
盒子模型(Box Model) ■ 盒子模型——概念 在网页设计中常用的属性名:内容(content),填充(padding),边框(border),边界(margin),CSS 盒子模式都具备这些属 ...
- 使用 Jackson 树模型(tree model) API 处理 JSON
http://blog.csdn.net/gao1440156051/article/details/54091702 http://blog.csdn.net/u010003835/article/ ...
随机推荐
- Redis基础(转)
ServiceStack.Redis实践 Redis的C#客户端我选择的是ServiceStack.Redis,相比Booksleeve redis-sharp等方案,它提供了一整套从 Redi ...
- java io流之BufferReader&BufferedWriter
BufferedReader 由Reader类扩展而来,提供通用的缓冲方式文本读取,而且提供了很实用的readLine,读取一个文本行,从字符输入流中读取文本,缓冲各个字符,从而提供字符.数组和行的高 ...
- extern关键字
1.extern "C" void func(){...} extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其 ...
- 枚举全排列(包括数列中有重复数)的C语言实现
据说是用了DFS的思想--然鹅并不知道这是DFS. 主要就是选取一个数放到数组相应位置上,然后递归的排列剩下的数组,将剩下的数组递归排列完了之后再把数放回去,然后这一层递归就返回了-- 有重复数的话遇 ...
- dojo创建tree
今天介绍dojo目录树的效果,效果如下图: HTML代码如下: <body class="claro"> <div id="rootlessTree&q ...
- <转> Lua使用心得(2)
在lua脚本调用中,如果我们碰到一种不好的脚本,例如: do do end 那我们的程序主线程也会被阻塞住.那我们如何防止这种问题呢?下面就给出一个解决的办法. 首先为了不阻塞主线程,那我们就要开一个 ...
- hibernate报错Unknown integral data type for ids : java.lang.String
package com.model; // Generated 2016-10-27 14:02:17 by Hibernate Tools 4.3.1.Final /** * CmDept gene ...
- 从tomcat启动到springIoC容器初始化(编辑中)
tomcat的启动一般是从startup.bat/startup.sh开始,然后启动catalina.bat/catalina.sh,然后启动bootstrap.jar包 那么它们启动的时候都做了哪些 ...
- MVC中获取模型属性的Range和StringLength验证特性设置
MVC中的客户端及服务端模型验证信息都以ModelMetadata类型作为承载,在获得属性的ModelMetadata之后(还不知道怎么获取ModelMetadata的童鞋请自行恶补),我们可以轻松得 ...
- java javacv调用摄像头并拍照
调用摄像头并拍张照片,我一开始用的java的jmf媒体框架,但这个有很多的局限性不好使并且很有麻烦,兜了一圈发现javacv东西,研究之后这东西简单,方便:废话不多说了来重点. javacv官网:点击 ...