2017-06-23 35 views
-6

考慮以下的簡單代碼:模板專業化是如何工作的?

template<typename U> 
U foo(U a, U b){ 
    //we don't really care about the body 
    return a + b; 
} 

和實例:

int a = foo(1, 2); 

我明白,編譯時,foo是專業化,編譯器生成:

int foo(int a, int b){ 
    //we don't really care about the body 
    return a + b; 
} 

什麼是序列編譯器通過它生成這個專門的代碼?例如,我知道如果U沒有'+'運算符,那麼代碼將不會編譯,因此會執行一些成員函數表檢查,並且在某個點上會生成函數簽名。

是否有返回類型,參數,操作等被評估的特殊命令?

+1

「它是否編譯正確」 如果編譯不正確,它不會做任何專門化。 –

+0

我已經調整了問題以闡明我的意圖。 –

+0

你有沒有試過編譯你的代碼? –

回答

1

這不是專業化,這是instanciation。

模板管理兩遍。

第一個幾乎是句法;編譯器只是驗證代碼看起來是否正確。

然後,當您使用給定或推導類型的模板(instanciate it)時,它會嘗試生成代碼(如果還沒有完成),所以當它遇到a+b時,它只會嘗試找到相應的操作符類型。如果找不到,則會發出錯誤,否則會發出代碼(最終會發生其他一些錯誤)。

+0

所以這是編譯之前?預處理器是否處理這個問題? –

+0

不,它是編譯器,請參閱標準部分** 2.2翻譯階段**。 *翻譯單元*和*實例化單元*的概念。 –

+0

謝謝,我會的 –