在這裡先給大家提出乙個問題:編譯器怎麼知道我呼叫的這個函式應該是非模板函式?還是特化的模板函式?還是模板函式例項化?更或者是應該選擇哪乙個模板來例項化?
可能上面的問題說起來有點繞,我用下面的**舉例吧:
templatevoid func(t a)
templatevoid func(t* a)
template<>
void func(char a)
void func(double a)
int main()
在上面這個**中,你能準確指出main函式中四次呼叫func分別是對應呼叫的哪個(模板)函式嗎?更或者是會報二義錯?
當然,你將**貼上到你的編譯器中你會發現並沒有報錯。說明不僅這樣的定義是沒有錯的,而且函式呼叫在選擇原型的時候有乙個順序。那麼這個順序是什麼呢? 這就是我們接下來要講的乙個內容 ————過載解析
具體定義是這樣的: 對於函式過載、函式模板和函式模板過載,c++需要有乙個定義良好的策略,來決定函式呼叫哪乙個函式的定義,尤其是有多個引數的時候。而這個過程我們稱之為過載解析。
我們先來看看過載解析的幾個基本步驟:
第一步:建立候選函式列表,其中包含於被呼叫函式的名稱相同的函式和模板函式。
第二步:使用候選函式列表建立可行函式列表。這些都是引數數目正確的函式,為此有乙個隱式轉換序列,其中包括實參型別與相應的形參型別完全匹配的情況。例如:使用float引數的函式呼叫可以將該引數轉換成double,從而與double形參匹配。也可以用模板去生成乙個float 例項。
第三步:確定是否有最佳的可行函式(唯一),如果有,則呼叫它,否則該函式呼叫就報錯!
未完待續
C 版本知多少
以前一直沒搞懂c 到底有些什麼版。到底咋回事,一位研究生同事還問過我c 和visual c 有什麼關係?坑嗲了吧?他都做c 開發的人都不曉得。這裡來解釋一下 microsoft visual c 6 非託管的開發工具 microsfot visual c net 基本.net的託管開發工具 borl...
C 擴充套件方法知多少
前言 上篇 序列化效率比拼 誰是最後的贏家newtonsoft.json 介紹了下序列化方面的知識。看過demo的朋友可能注意到了裡面就用到過泛型的擴充套件方法,本篇打算總結下c 擴充套件方法的用法。博主打算分三個層面來介紹這個知識點,分別是 net內建物件的擴充套件方法 一般物件的擴充套件方法 泛...
C 之sizeof 知多少
sizeof計算的是在棧中分配的記憶體大小。1.sizeof的使用形式 sizeof var name 或者sizeof var name。變數名可以不用括號括住 sizeof a 資料型別必須用括號括起來 sizeof int 2.sizeof可以對表示式求值 sizeof 2 3.14 實際是s...