2014-05-05 187 views
5
template<typename TA, typename TB> 
void foo (TA a, TB b); // #1 

template<typename T> 
void foo (T a, T b); // #2 

int a, b;  
foo(a, b); 

在這種情況下,調用foo#2。爲什麼?C++模板函數選擇

+1

@πάνταῥεῖ:我不確定這與這個問題有什麼關係。 –

+0

@OliCharlesworth我還沒有;)......認爲dyp的評論比我想表達的更好。 –

+8

在這種情況下,兩個模板都會生成一個函數簽名'void foo(int,int)',所以它們是基於*偏序* aka *選擇的,哪一個更專用*。 – dyp

回答

1

如果你要作出明確的模板參數,你可以使用:

foo<int, int>(a, b); 

調用第一個函數。

你可以使用:

foo<int>(a, b); 

調用第二功能。

由於您讓編譯器選擇函數,因此它選擇了更具限制性的函數,即第二個函數。

爲什麼第二個更具限制性?編譯器必須推導出一種類型來使用第二個函數。它必須推出兩種類型才能使用第一種。

+2

我認爲'foo (a,b)'仍然執行重載解析,並且只使用第二個函數,因爲那個函數更專用。 – dyp

+0

IMO第二個是* more *限制性的,ergo *更專業化*:它會單獨推導出兩個參數的類型,如果推導出的類型不相同,則推導失敗。 – dyp

+0

@dyp我認爲你是對的。感謝您指出錯誤。更新了我的答案。 –