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