欢迎来到天天文库
浏览记录
ID:1641764
大小:59.50 KB
页数:13页
时间:2017-11-12
《c++模板类(一)理解编译器的编译模板过程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、c++模板类(一)理解编译器的编译模板过程分类: c++模板类2008-11-0517:40 2734人阅读 评论(4) 收藏 举报 如何组织编写模板程序 前言常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”。看看我们几乎每天都能遇到的模板类吧,如STL,ATL,WTL,以及Boost的模板类,都能体会到这样的滋味:接口简单,操作复杂。我在5年前开始使用模板,那时我看到了MFC的容器类。直到去年我还没有必要自己编写模板类。可是在我需要自己编写模板类时,我首先遇到的事实却是“传统”编程方法(在*.h文件声明,在*.cpp文
2、件中定义)不能用于模板。于是我花费一些时间来了解问题所在及其解决方法。本文对象是那些熟悉模板但还没有很多编写模板经验的程序员。本文只涉及模板类,未涉及模板函数。但论述的原则对于二者是一样的。问题的产生通过下例来说明问题。例如在array.h文件中有模板类array://array.htemplateclassarray{ Tdata_[SIZE]; array(constarray&other); constarray&operator=(constarray&other);public: array(){};
3、 T&operator[](inti){returndata_[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){arrayintArray;
4、intArray.set_elem(0,2);intfirstElem=intArray.get_elem(0);int*begin=intArray;} 这时编译和运行都是正常的。程序先创建一个含有50个整数的数组,然后设置数组的第一个元素值为2,再读取第一个元素值,最后将指针指向数组起点。但如果用传统编程方式来编写会发生什么事呢?我们来看看:将array.h文件分裂成为array.h和array.cpp二个文件(main.cpp保持不变)//array.h templateclassarray{
5、 Tdata_[SIZE]; array(constarray&other); constarray&operator=(constarray&other); public: array(){}; T&operator[](inti); constT&get_elem(inti)const; voidset_elem(inti,constT&value); operatorT*(); }; //array.cpp#include"array.h"template6、enameT,intSIZE>T&array::operator[](inti) { returndata_[i]; }templateconstT&array::get_elem(inti)const { returndata_[i]; }templatevoidarray::set_elem(inti,constT&value) { data_[i]=value; }template7、,intSIZE>array::operatorT*() { returndata_; } 编译时会出现3个错误。问题出来了: 为什么错误都出现在第一个地方? 为什么只有3个链接出错?array.cpp中有4个成员函数。 要回答上面的问题,就要深入了解模板的实例化过程。模板实例化程序员在使用模板类时最常犯的错误是将模板类视为某种数据类型。所谓类型参量化(parameterizedtypes)这样的术语导致了这种误解。模板当然不是数据类型,模板就是模板,恰如其名: 编译器使用模板,通过更换模板参数来创建数据类型。这个过程就8、是模板实例
6、enameT,intSIZE>T&array::operator[](inti) { returndata_[i]; }templateconstT&array::get_elem(inti)const { returndata_[i]; }templatevoidarray::set_elem(inti,constT&value) { data_[i]=value; }template7、,intSIZE>array::operatorT*() { returndata_; } 编译时会出现3个错误。问题出来了: 为什么错误都出现在第一个地方? 为什么只有3个链接出错?array.cpp中有4个成员函数。 要回答上面的问题,就要深入了解模板的实例化过程。模板实例化程序员在使用模板类时最常犯的错误是将模板类视为某种数据类型。所谓类型参量化(parameterizedtypes)这样的术语导致了这种误解。模板当然不是数据类型,模板就是模板,恰如其名: 编译器使用模板,通过更换模板参数来创建数据类型。这个过程就8、是模板实例
7、,intSIZE>array::operatorT*() { returndata_; } 编译时会出现3个错误。问题出来了: 为什么错误都出现在第一个地方? 为什么只有3个链接出错?array.cpp中有4个成员函数。 要回答上面的问题,就要深入了解模板的实例化过程。模板实例化程序员在使用模板类时最常犯的错误是将模板类视为某种数据类型。所谓类型参量化(parameterizedtypes)这样的术语导致了这种误解。模板当然不是数据类型,模板就是模板,恰如其名: 编译器使用模板,通过更换模板参数来创建数据类型。这个过程就
8、是模板实例
此文档下载收益归作者所有