<P>函数模板就是一个函数的模板,其中函数定义中的类型并不是实际类型,编译器可以根据函数模板和相应的实际类型来产生函数的实例(也就是函数)。</P>' e* P! u) I; L8 L) l
<P><FONT color=#0000ff>重载函数模板</FONT>与重载函数有联系,因为都是重载,但这里重载的是函数模板,也就是把模板中的(形式)类型用相应的实际类型来重载,即<FONT color=#ff0000>声明一个某种类型的显式函数模板</FONT>----这样的模板中的类型就是实际类型了,当然,原来一样的类型这里也应重载为同样类型。这就可以方便地使用函数模板来处理隐式类型转换的情况了。</P>/ {4 R5 V7 }/ {8 n' T- r4 n! U
<P>C++在匹配函数时遵循以下约定(也就是调用函数的"优先级"):</P>
. Q6 q+ E- F% |+ ~<P><FONT color=#003399>(1)寻找一个参数完全匹配的函数,如有就用它。但是如果有多于一个这样的函数就返回出错信息。</FONT></P>
+ w# P1 r2 ^# X, ?- L<P><FONT color=#003399>(2)寻找函数模板,把它实例化成一个匹配的模板函数,如果找到了,就调用它。</FONT></P>
# T9 {4 f# n0 S. ~* X+ [# f<P><FONT color=#003399>(3)如果有一个函数经过隐式类型转换可使所给参数匹配的话,就调用它。</FONT></P>; N* p1 l- D+ a0 Q! B: m4 |2 i
<P><FONT color=#003399>(4)用上面的方法都找不到可调用函数时,返回出错信息。</FONT></P>0 f# e# y: h5 M0 k
<P><FONT color=#0000ff>函数模板的处理方法</FONT>:为了能使编译器在使用模板之间就"看到"模板,就要把它放在使用模板函数的程序段之前,所以为了确保"万无一失"并使程序简洁,一般<FONT color=#ff0000>将函数模板的声明及其实现存为一个头文件</FONT>,然后在程序中包含它就可以了。</P>
3 ~$ @9 I5 D( U0 X9 [8 W<P><FONT color=#0000ff>特定的模板函数</FONT>:有时,模板实例化为某种类型的函数会产生错误的结果,比如在用指针类型作模板的参数时。这时就要另外定义一个函数实例,来对这种类型的数据进行相应处理。这个函数是专门用来<FONT color=#0000ff>替换</FONT>模板产生的<FONT color=#0000ff>实例的</FONT>,所以叫做<FONT color=#0000ff>特定模板函数</FONT>。有了这样的函数,C++编译器就优先调用它从而使模板不会产生这种类型的函数实例。这和重载函数模板不同,重载函数模板重载的是模板而不是模板产生的实例(即函数) 。 </P>
% y. }3 Y* Q' k I$ W4 \<P>有几个术语要区别开来,<FONT color=#0000ff>函数模板是模板声明</FONT>,<FONT color=#0000ff>模板函数是模板实例</FONT>,<FONT color=#0000ff>特定模板函数则是替换模板实例</FONT>。</P>
1 o( }3 _" J+ s7 C' a<P>对于这一段内容,相应的<FONT color=#0000ff>实际运用</FONT>应该熟练掌握。</P> |