1. 程式人生 > 實用技巧 >Scala學習

Scala學習

一、例子

template <typename T>
inline void callWithMax(const T& a, const T& b){
    f(a > b ? a : b);
}
int main(){
    return 0;    
}

二、理解

  關於函式模板的編譯以及函式模板的例項化從這個例子可以得到解答。

  單純編譯上述程式碼不會產生編譯錯誤,但是明顯在callWithMax這個函式模板的函式體中呼叫了一個沒有宣告的函式f, 如果callWithMax是一個普通函式, 那麼這段程式碼一定會報一個"error: 'f' is not declared in this scope"

的錯誤。

  可見這段程式碼編譯成功的原因無非是沒有對函式體進行編譯,這就得說一說函式模板與函式模板的例項化,一個函式模板只有在例項化後才會產生出一個特定的函式, 例項化之前,編譯器只會檢查函式模板的宣告部分,而不會檢查函式模板的函式體部分;只有發生了該函式模板的函式呼叫時(函式模板例項化),編譯器才會生成特定例項化的函式程式碼並且對例項化後的函式體進行語法檢查等。

  也就是說,我們是不是可以這樣理解:函式模板只是一個空殼,在未例項化前,編譯器只能看到這個殼子的首部也就是函式模板的宣告,在利用這個空殼生成了一個真正的“產品”也就是例項化後產生的例項函式才擁有了能夠被編譯器看到的函式體部分,進而被編譯器進行函式宣告和函式體部分的語法檢查。