C++模板简介

转自http://www.cppblog.com/abilitytao/archive/2009/04/03/78795.html

http://www.cnblogs.com/zhaobl/archive/2009/02/26/1398446.html

模板的概念

 

我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值,我们定义MAX()函数需要对不同的数据类型分别定义不同重载(Overload)版本。

 

但如果在主函数中,我们分别定义了 char a,b; 那么在执行max(a,b);时 程序就会出错,因为我们没有定义char类型的重载版本。

现在,我们再重新审视上述的max()函数,它们都具有同样的功能,即求两个数的最大值,能否只写一套代码解决这个问题呢?这样就会避免因重载函数定义不 全面而带来的调用错误。为解决上述问题C++引入模板机制,模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。

函数模板

函数模板的一般形式如下:

Template <class或者也可以用typename T>

返回类型 函数名(形参表)
{//函数定义体 }

例子:

 

类模板

定义一个类模板:

Template < class或者也可以用typename T >
class类名{
//类定义......
};

例子:

非类型模版参数

一般来说,非类型模板参数可以是常整数(包括枚举)或者指向外部链接对象的指针。那么就是说,浮点数是不行的,指向内部链接对象的指针是不行的。

 

 

函数模板与模板函数

函数模板的重点是模板,模板函数的重点则是函数,是函数模板的一个实例;同样地,类模板的重点是模板,模板类的重点是类,是类模板的一个实例。

以上面的min函数为例,T min(T x,T y)是函数模板,而min<int>(int x,int y)和min<double>(double x,double y)则是模板函数。

在使用时min(n1,n2)和min(d1,d2)等价于min<int>(n1,n2)和min<double>(d1,d2),因为编译器会隐式的将min(n1,n2)转化成min<int>(n1,n2),将min(d1,d2)隐式的转化成min<double>(d1,d2)。

在使用时,可以显式的调用即min<int>(n1,n2),也可以利用编译器隐式的调用min(d1,d2)。

但是,当函数模板的参数是模板类(如Vector或者MFC的CArray)时,必须显式的调用模板函数(VC++8可以不用显式调用)。

  

如果上述函数模板在.h文件中定义,在.cpp中使用,则在OnOK函数之前必须加上template <class T>,否则编译会出现:

error C2062: type 'int' unexpected

如果此时将ArrTest<int>(arInt);改回ArrTest(arInt);再编译则会出现:

fatal error C1001: INTERNAL COMPILER ERROR
        (compiler file 'msc1.cpp', line 1786)

模板的限制

模板类或模板函数的声明与定义必须位于同一个文件中!除非新一代的编译器支持关键字export.如果编译器不支持export关键字,但我们又想把声明与定义分开写,那该如何操作呢?方法如下:把模板声明写在.h中,模板定义写在.cpp中,需要注意的是,我们并不像一般的文件包含那样,在.cpp中包含.h,而是在调用处如main.cpp中,把这两个东东包含进来如:

test.h

test.cpp

 

 

 

mian.cpp 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值