0:
模板是一些為多種類型而編寫的函數(shù)和類,而且這些類型都沒有指定。當(dāng)使用模板的時(shí)候,只需要把所希望的類型作為一個(gè)(顯示或隱示的)實(shí)參傳遞給模板。模板是語言本身所具有的特效,她完全支持類型檢查和作用域。
并不是把模板編譯成一個(gè)可以處理任何類型的單一實(shí)體;而是對(duì)于實(shí)例化模板參數(shù)的每種類型,(編譯器)都從模板產(chǎn)生出一個(gè)不同是實(shí)體。
這種用具體類型代替模板參數(shù)的過程叫實(shí)例化(instantiation)。她產(chǎn)生一個(gè)模板的實(shí)例。
1:
如何試圖基于一個(gè)不支持模板內(nèi)部所使用的操作的類型實(shí)例化一個(gè)模板,將會(huì)導(dǎo)致一個(gè)編譯期錯(cuò)誤。
so,模板被編譯了兩次:a,實(shí)例化之前,先檢查模板代碼本身語法是否正確;b,在實(shí)例化期間,檢查是否所模板的有調(diào)用都有效。
這不同于普通函數(shù)中編譯與鏈接之間的區(qū)別,對(duì)于普通函數(shù)只要有聲明(不需要定義)就可以通過編譯。然而當(dāng)使用函數(shù)模板并引發(fā)模板實(shí)例化的時(shí)候,編譯器需要查看模板的定義。
2:實(shí)參演繹deduction
template <typename T>//T是模板參數(shù)
inline T const& max (T const& a, T const& b)//a.b是調(diào)用參數(shù)
{
return a < b ? b : a;
}
如果傳遞兩個(gè)int給參數(shù)類型T const&,那么編譯器能夠得出結(jié)論:T必須是int。這里不允許進(jìn)行自動(dòng)類型轉(zhuǎn)換。
max(4, 5.6);
error MSB6006: “CL.exe”
error C2782: “const T &max(const T &,const T &)”: 模板 參數(shù)“T”不明確
解決error:
對(duì)實(shí)參強(qiáng)制類型轉(zhuǎn)換max(4, static_cast<int>4.2);
顯示指定T類型指定兩個(gè)不同類型參數(shù)。
inline T1 const& max (T1 const& a, T2 const& b)
對(duì)于指定兩個(gè)不同類型參數(shù),由于該模板函數(shù)有返回類型,另個(gè)參數(shù)的實(shí)參可能要轉(zhuǎn)型為返回類型而不會(huì)在意調(diào)用者意圖;而且把另一個(gè)參數(shù)轉(zhuǎn)型為返回類型的過程將會(huì)創(chuàng)建一個(gè)局部臨時(shí)對(duì)象,所以返回類型必須是T1不能是T1 const& 。
因?yàn)檎{(diào)用參數(shù)(a,b)的類型構(gòu)造自模板參數(shù)T,所有模板參數(shù)和調(diào)用參數(shù)通常是相關(guān)的。這個(gè)概念就叫實(shí)參演繹。
如max<double>(4, 4.2);用double實(shí)例化T,從而構(gòu)造調(diào)用參數(shù)類型。
當(dāng)模板參數(shù)和調(diào)用參數(shù)沒有發(fā)生關(guān)聯(lián)或不能由調(diào)用參數(shù)確定模板參數(shù)時(shí),在調(diào)用時(shí)就必須顯示指定模板實(shí)參。
template <typename T1, typename T2, typename RT>
inline RT max (T1 const& a, T2 const&
b);
模板實(shí)參演繹并不適合返回類型,因?yàn)镽T不會(huì)出現(xiàn)在調(diào)用參數(shù)的類型里面,因此調(diào)用并不能演繹出RT。所以需要顯示指導(dǎo)模板實(shí)參列表。
max<int, double, double> max(4, 4.2);
如果改變模板參數(shù)的聲明順序就只需指定返回類型
template < typename RT , typename T1, typename T2,>
max<double>(4, 4.2);
因?yàn)楸仨氾@示指定”最后一個(gè)不能被隱式演繹的模板之前的”所有實(shí)參類型,返回類型不能被演繹而調(diào)用參數(shù)可讓演繹過程推導(dǎo)出。
3:重載函數(shù)模板
int const& max(int onst& a, int const& b)
{return a<b?b:a; }
template<typename T>
inline T const& max(T const& a, T const& b)
{return a<b?b:a; }
template<typename T>
inline T const& max(T const& a, T const& b, T const& c)
{ max(max(a, b), c); }
max(7,4,5);//調(diào)用三參數(shù)的模板
max(4.2, 3.0);//調(diào)用max<double>(通過實(shí)參演繹)
max(‘a(chǎn)’, ‘b’);//調(diào)用max<char>(通過實(shí)參演繹)
max(3, 5);//調(diào)用int重載的非模板函數(shù)
max(3, 5.1);//調(diào)用int重載的非模板函數(shù)
max<>(3, 5);// 調(diào)用max<int>(通過實(shí)參演繹)
max<double>(3, 5);// 調(diào)用max<double>(沒實(shí)參演繹)
標(biāo)題名稱:template_1-創(chuàng)新互聯(lián)
地址分享:http://aaarwkj.com/article4/icpoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、云服務(wù)器、營銷型網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航、App設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容