?1?//?C2782b.cpp
?2?//?compile?with:?/clr
?3?generic<typename?T>?void?gf(T,?T)?{?}
?4?
?5?int?main()?{
?6????gf(1,?'c');?//?C2782
?7????//?try?the?following?line?instead
?8????//?gf<int>(1,?'c');
?9?}
10?
模板中實(shí)參的演繹
可以先看看下面一段使用模板的代碼:
?1
template?
<
typename?T
>
?2
?inline?T?
const
&
?max(T?
const
&
?a,T?
const
&
?b)
{
?3
????????????
return
?a
<
b
?
b:a;
?4
????????????}
?5
?6
#include?
<
iostream
>
?7
#include?
<
string
>
?8
using
?
namespace
?std;
?9
int
?main()
{
10
????
//
-------------------正確---------
11
????
int
?i
=
42
;
12
????cout
<<
"
Max(7,i)
"
<<
::max(
7
,i)
<<
endl;
13
14
????
double
?f1
=
3.4
;
15
????
double
?f2
=-
6.7
;
16
????cout
<<
"
Max(f1,f2):
"
<<
::max(f1,f2)
<<
endl;
17
18
????
string
?s1
=
"
abcd
"
;
19
????
string
?s2
=
"
bacd
"
;
20
????cout
<<
"
max(s1,s2):
"
<<
::max(s1,s2)
<<
endl;
21
22
????
//
-------------------有問題--------
23
????cout
<<
::max(
1
,
1.2
)
<<
endl;?
//
這句會(huì)出錯(cuò)
24
????}
25
在VC2005 EE編譯的時(shí)候,出現(xiàn)錯(cuò)誤,錯(cuò)誤碼是C2782,可以在附帶的幫助中
查看這個(gè)錯(cuò)誤碼。
?
可以看到錯(cuò)誤信息是:
?
?
Error Message
'declaration' : template parameter 'identifier' is ambiguous
The compiler cannot determine the type of a template argument.
?
???這意思是說申明的模板參數(shù)標(biāo)識(shí)符是有二義性的,編譯器無法決定模板參數(shù)的類型。
???順便附帶上幫助中給的例子如下:
?1?//?C2782.cpp
?2?template<typename?T>
?3?void?f(T,?T)?{}
?4?
?5?int?main()?{
?6?f(1,?'c');???//?C2782
?7?//?try?the?following?line?instead
?8?//?f<int>(1,?'c');
?9?}
10?
解決方法:
?
出現(xiàn)2782錯(cuò)誤的,那么我們?cè)趺唇鉀Q呢?
可以用下面三種方法,
方法一:對(duì)實(shí)參進(jìn)行強(qiáng)制類型轉(zhuǎn)換,讓他們可以互相匹配
1
max(static_cast<double>(1),1.2) 方法二:顯示的指出T的類型
max<double>(1,1.2)方法三:可以指定兩個(gè)參數(shù)可以具有不同的類型
那么上面的模板例子可以改寫成下面這樣的
1
template?<typename?T1,typename?T2,>
2
?inline?T1?max(T1?const&?a,T2?const&?b)
{
3
????????????????return?a<b?b:a;
4
????????????????}
5
上面這樣定義模板,就可以傳遞不同的參數(shù),但是這樣做就必須要定義好返回類型,就是上面的T1,這是此方法的缺點(diǎn)。除此之外,因?yàn)閮蓚€(gè)參數(shù)類型不一樣,在進(jìn)行返回的時(shí)候,會(huì)在把參數(shù)b轉(zhuǎn)化成T1類型的時(shí)候自動(dòng)創(chuàng)建一個(gè)新的局部變量,這樣就不可以用引用了,只能返回T1,而不是T1 const&。
?
為了解決只能返回T1和T2兩種類型之一的問題,我們可以另外再加上一個(gè)額外的類型,暫且我們給他命名為returnType,那么新的模板如下:1
template?<?typename?returnType,typename?T1,typename?T2,>
2
?inline?returnType?max(T1?const&?a,T2?const&?b)
{
3
????????????????return?a<b?b:a;
4
????????????????}
5
這種方式的時(shí)候,要使用max方法就需要指定returnType的類型,
max<int,int,double>(1,1.2),因?yàn)樵谖覀冞@個(gè)例子里面,returnType是在第一位置,后面兩個(gè)類型是可以根據(jù)輸入?yún)?shù)類型自動(dòng)演繹(就用這個(gè)詞把,書上是這么叫的)的,所以我們可以只指定一個(gè),就是返回的類型,那么我們就可以這樣寫了max<int>(1,1.2).
以上就是模板中參數(shù)的演繹以及出現(xiàn)問題的基本的解決方法.
? 以上部分來源于閱讀《C++Templates?中文版》