找回密码
 注册

QQ登录

只需一步,快速开始

函数模板

[复制链接]
发表于 2008-9-29 20:19:26 | 显示全部楼层 |阅读模式
<P>函数模板就是一个函数的模板,其中函数定义中的类型并不是实际类型,编译器可以根据函数模板和相应的实际类型来产生函数的实例(也就是函数)。</P>
6 n( T( u6 ~  Q* Z4 Y  \<P><FONT color=#0000ff>重载函数模板</FONT>与重载函数有联系,因为都是重载,但这里重载的是函数模板,也就是把模板中的(形式)类型用相应的实际类型来重载,即<FONT color=#ff0000>声明一个某种类型的显式函数模板</FONT>----这样的模板中的类型就是实际类型了,当然,原来一样的类型这里也应重载为同样类型。这就可以方便地使用函数模板来处理隐式类型转换的情况了。</P>. b7 s0 m' v: w2 j' G
<P>C++在匹配函数时遵循以下约定(也就是调用函数的"优先级"):</P>+ I5 j) ~( ^2 [- M5 U5 {6 E
<P><FONT color=#003399>(1)寻找一个参数完全匹配的函数,如有就用它。但是如果有多于一个这样的函数就返回出错信息。</FONT></P>
6 w9 w/ N. i$ j: g9 Y, V<P><FONT color=#003399>(2)寻找函数模板,把它实例化成一个匹配的模板函数,如果找到了,就调用它。</FONT></P>0 v& {/ u& X; S, a3 j
<P><FONT color=#003399>(3)如果有一个函数经过隐式类型转换可使所给参数匹配的话,就调用它。</FONT></P>
4 J' N1 T& [( S9 ]" p0 v( e<P><FONT color=#003399>(4)用上面的方法都找不到可调用函数时,返回出错信息。</FONT></P>
! D0 Q7 u- {; j7 V# w" W0 C<P><FONT color=#0000ff>函数模板的处理方法</FONT>:为了能使编译器在使用模板之间就"看到"模板,就要把它放在使用模板函数的程序段之前,所以为了确保"万无一失"并使程序简洁,一般<FONT color=#ff0000>将函数模板的声明及其实现存为一个头文件</FONT>,然后在程序中包含它就可以了。</P>
8 l  z, n0 o4 O9 h1 B  J. s<P><FONT color=#0000ff>特定的模板函数</FONT>:有时,模板实例化为某种类型的函数会产生错误的结果,比如在用指针类型作模板的参数时。这时就要另外定义一个函数实例,来对这种类型的数据进行相应处理。这个函数是专门用来<FONT color=#0000ff>替换</FONT>模板产生的<FONT color=#0000ff>实例的</FONT>,所以叫做<FONT color=#0000ff>特定模板函数</FONT>。有了这样的函数,C++编译器就优先调用它从而使模板不会产生这种类型的函数实例。这和重载函数模板不同,重载函数模板重载的是模板而不是模板产生的实例(即函数) 。 </P>! u4 I8 ~; n9 F" L7 K
<P>有几个术语要区别开来,<FONT color=#0000ff>函数模板是模板声明</FONT>,<FONT color=#0000ff>模板函数是模板实例</FONT>,<FONT color=#0000ff>特定模板函数则是替换模板实例</FONT>。</P>1 V" V2 n5 E9 B. `' d# _, E5 M' ^
<P>对于这一段内容,相应的<FONT color=#0000ff>实际运用</FONT>应该熟练掌握。</P>
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|本地广告联系: QQ:905790666 TEL:13176190456|Archiver|手机版|小黑屋|汶上信息港 ( 鲁ICP备19052200号-1 )

GMT+8, 2025-4-29 15:23

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表