置入式模型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/ ...
随机推荐
- Linuxmint&win7
一.选择好Linux发行版,并下载ISO镜像.Linux发行版众多,然而主流的无非Linuxmint.Ubuntu.Fedora.Debian等,当然国内的Deepin也不错.小编旧文已专门就&quo ...
- shell获取ip
ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"
- 生成SSH key
1.打开终端 2.输入cd ~/.ssh 3.输入ssh-keygen -t rsa -C (邮箱) 4.前往文件夹 /Users/admin/.ssh/id_rsa 5.找到id_rsa.pub , ...
- JQuery Easy Ui DataGrid
Extend from $.fn.panel.defaults. Override defaults with $.fn.datagrid.defaults. The datagrid display ...
- ios 正则表达式之验证手机号、邮箱、身份证、银行卡
1.手机号 + (BOOL) IsPhoneNumber:(NSString *)number { NSString *phoneRegex1=@"1[34578]([0-9]){9}&qu ...
- [刘阳Java]_斗胆介绍一下Eclipse快捷键大全[超详细]_第6讲
斗胆让我在这里介绍一下Eclipse快捷键有哪些 ctrl+shirt+r 打开资源 这组快捷键可以让你开打Eclipse工作区中任何一个文件,你只需要输入你想查找的文件名字即可,而且绝对支持模糊检索 ...
- C# 闭包
1. 首先要说明的是, delegate 被编译器 编译成一个class, 所以才能传来传去(具体参考 <CLR via C#>第四版), 所以 Action.Func也是如此 2. 在C ...
- MySQL命令实例
显示数据表结构 1.desc(describe) tablename;2.show columns from tablename;3.use information_schema; select ...
- MVC5+EF6 简易版CMS(非接口) 第四章:使用业务层方法,以及关联表解决方案
目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...
- CentOS 6.5升级Python和安装IPython
<转自:http://www.noanylove.com/2014/10/centos-6-5-sheng-ji-python-he-an-zhuang-ipython/>自己常用.以做备 ...