c模板类1理解编译器的编译模板过程

c模板类1理解编译器的编译模板过程

ID:30360352

大小:86.80 KB

页数:12页

时间:2018-12-29

c模板类1理解编译器的编译模板过程_第1页
c模板类1理解编译器的编译模板过程_第2页
c模板类1理解编译器的编译模板过程_第3页
c模板类1理解编译器的编译模板过程_第4页
c模板类1理解编译器的编译模板过程_第5页
资源描述:

《c模板类1理解编译器的编译模板过程》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、c模板类1理解编译器的编译模板过程c++模板类(1)理解编译器的编译模板过程2010-04-1309:40如何组织编写模板程序前言常遇到询问使用模板到底是否容易的问题,我的回答是:"模板的使用是容易的,但组织编写却不容易"。看看我们几乎每天都能遇到的模板类吧,如STL,ATL,WTL,以及Boost的模板类,都能体会到这样的滋味:接口简单,操作复杂。我在5年前开始使用模板,那时我看到了MFC的容器类。直到去年我还没有必要自己编写模板类。可是在我需要自己编写模板类时,我首先遇到的事实却是"传统"编程方法(在*.h文件声明,在*.cpp文件中定义)不能用于模板。于是

2、我花费一些时间来了解问题所在及其解决方法。本文对象是那些熟悉模板但还没有很多编写模板经验的程序员。本文只涉及模板类,未涉及模板函数。但论述的原则对于二者是一样的。问题的产生通过下例来说明问题。例如在array.h文件中有模板类array://array.htemplatetypenameT,intSIZEclassarray{Tdata_[SIZE];array(constarray&other);constarray&operator=(constarray&other);public:array(){};T&operator(inti){returndata

3、_[i];}constT&get_elem(inti)const{returndata_[i];}voidset_elem(inti,constT&value){data_[i]=value;}operatorT*(){returndata_;}};然后在main.cpp文件中的主函数中使用上述模板://main.cpp#include"array.h"intmain(void){arrayint,50intArray;intArray.set_elem(0,2);intfirstElem=intArray.get_elem(0);int*begin=intAr

4、ray;}这时编译和运行都是正常的。程序先创建一个含有50个整数的数组,然后设置数组的第一个元素值为2,再读取第一个元素值,最后将指针指向数组起点。但如果用传统编程方式来编写会发生什么事呢?我们来看看:将array.h文件分裂成为array.h和array.cpp二个文件(main.cpp保持不变)//array.htemplatetypenameT,intSIZEclassarray{Tdata_[SIZE];array(constarray&other);constarray&operator=(constarray&other);public:array(

5、){};T&operator(inti);constT&get_elem(inti)const;voidset_elem(inti,constT&value);operatorT*();};//array.cpp#include"array.h"templatetypenameT,intSIZET&arrayT,SIZE:operator(inti){returndata_[i];}templatetypenameT,intSIZEconstT&arrayT,SIZE:get_elem(inti)const{returndata_[i];}templatetyp

6、enameT,intSIZEvoidarrayT,SIZE:set_elem(inti,constT&value){data_[i]=value;}templatetypenameT,intSIZEarrayT,SIZE:operatorT*(){returndata_;}编译时会出现3个错误。问题出来了:为什么错误都出现在第一个地方?为什么只有3个链接出错?array.cpp中有4个成员函数。要回答上面的问题,就要深入了解模板的实例化过程。模板实例化程序员在使用模板类时最常犯的错误是将模板类视为某种数据类型。所谓类型参量化(parameterizedtypes

7、)这样的术语导致了这种误解。模板当然不是数据类型,模板就是模板,恰如其名:编译器使用模板,通过更换模板参数来创建数据类型。这个过程就是模板实例化(Instantiation)。从模板类创建得到的类型称之为特例(specialization)。模板实例化取决于编译器能够找到可用代码来创建特例(称之为实例化要素,pointofinstantiation)。要创建特例,编译器不但要看到模板的声明,还要看到模板的定义。模板实例化过程是迟钝的,即只能用函数的定义来实现实例化。再回头看上面的例子,可以知道array是一个模板,arrayint,50是一个模板实例-一个类型。

8、从array创建arra

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。