<P>函数模板就是一个函数的模板,其中函数定义中的类型并不是实际类型,编译器可以根据函数模板和相应的实际类型来产生函数的实例(也就是函数)。</P> ]/ ]* c, v% r" h
<P><FONT color=#0000ff>重载函数模板</FONT>与重载函数有联系,因为都是重载,但这里重载的是函数模板,也就是把模板中的(形式)类型用相应的实际类型来重载,即<FONT color=#ff0000>声明一个某种类型的显式函数模板</FONT>----这样的模板中的类型就是实际类型了,当然,原来一样的类型这里也应重载为同样类型。这就可以方便地使用函数模板来处理隐式类型转换的情况了。</P>
1 ^5 l& g! b7 S" L# M+ c9 S( B<P>C++在匹配函数时遵循以下约定(也就是调用函数的"优先级"):</P>
% w4 S) j+ [* H! f+ t<P><FONT color=#003399>(1)寻找一个参数完全匹配的函数,如有就用它。但是如果有多于一个这样的函数就返回出错信息。</FONT></P>
1 E( F$ Y4 @( u: ]# o$ a) t2 O<P><FONT color=#003399>(2)寻找函数模板,把它实例化成一个匹配的模板函数,如果找到了,就调用它。</FONT></P>
* R% d6 w; x7 D6 N" b" Q<P><FONT color=#003399>(3)如果有一个函数经过隐式类型转换可使所给参数匹配的话,就调用它。</FONT></P>, R0 i$ k) l. P& o$ m, v5 Q
<P><FONT color=#003399>(4)用上面的方法都找不到可调用函数时,返回出错信息。</FONT></P>
5 O, N! A' V q! {8 J5 B u5 T<P><FONT color=#0000ff>函数模板的处理方法</FONT>:为了能使编译器在使用模板之间就"看到"模板,就要把它放在使用模板函数的程序段之前,所以为了确保"万无一失"并使程序简洁,一般<FONT color=#ff0000>将函数模板的声明及其实现存为一个头文件</FONT>,然后在程序中包含它就可以了。</P>& q: f- V0 j$ k n6 d ^; l. O8 L
<P><FONT color=#0000ff>特定的模板函数</FONT>:有时,模板实例化为某种类型的函数会产生错误的结果,比如在用指针类型作模板的参数时。这时就要另外定义一个函数实例,来对这种类型的数据进行相应处理。这个函数是专门用来<FONT color=#0000ff>替换</FONT>模板产生的<FONT color=#0000ff>实例的</FONT>,所以叫做<FONT color=#0000ff>特定模板函数</FONT>。有了这样的函数,C++编译器就优先调用它从而使模板不会产生这种类型的函数实例。这和重载函数模板不同,重载函数模板重载的是模板而不是模板产生的实例(即函数) 。 </P>1 s5 A$ e" `" @9 D
<P>有几个术语要区别开来,<FONT color=#0000ff>函数模板是模板声明</FONT>,<FONT color=#0000ff>模板函数是模板实例</FONT>,<FONT color=#0000ff>特定模板函数则是替换模板实例</FONT>。</P>
6 `2 B6 R+ u' c E! Z9 h% j, }<P>对于这一段内容,相应的<FONT color=#0000ff>实际运用</FONT>应该熟练掌握。</P> |