2012-09-25 42 views
2

從C++入門明確的說法,我知道,模板的參數變量,只有兩種轉換進行:一個是常量轉換,另一個是陣列/函數指針轉換轉換爲模板

但是,當談到明確的論點時,似乎一切都在改變。 假設我們有一個模板函數:

template <typename T> 
int compare(const T &a, const T &b) 
{ 
    // do comparison 
} 

如果沒有明確的說法參與,這樣的函數調用是非法的:

compare("foo", "foobar"); 

怪異的事情發生了(實際上,它可能不是很奇怪,但我做的不明白),當我們明確地做:

compare<std::string>("foo", "foobar"); 

看來,在第二個電話,「富」「foobar」轉換爲std::string,這是有爭議的。

模板顯式參數是否有特殊規則?謝謝。

+0

爲什麼這看起來有爭議嗎?通過提供顯式的模板參數,您表明您希望將相應的'T'參數轉換爲'const std :: string&',它通過使用字符串文字的'std :: string'構造函數重載來完成。你期待什麼行爲?如果'T'沒有轉換構造函數(或者具有'explicit'),那麼這不會發生。 –

+0

這是否意味着當我們用std :: string顯式綁定T時,會生成實際的函數代碼? –

回答

6

在第一種情況下,編譯器試圖從給定的參數中推導出類型T。從第一個參數中,編譯器推導出const char (&)[4](又名:4個字符數組的引用),從第二個參數獲得const char (&)[7]。這兩種類型不匹配,編譯器無法弄清楚T應該是什麼。

在第二個示例中,您明確指定T模板參數應爲std::string。所以Tstd::string。編譯器接受你給出的類型,並檢查給定的函數參數是否與該類型匹配。在這種情況下,參數適合,因爲"foo""foobar"可以隱式轉換爲std::string。 (const char[]降級到const char*,然後有一個構造函數可以構造std::stringconst char*

+1

+1:需要強調的是,對於模板參數推導,類型必須完美匹配(即不允許轉換)。另外,如果參數的類型是'T'而不是'T const&',那麼這些數組將衰變爲指針,這也是可行的。 –