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++模板函數選擇
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++模板函數選擇
如果你要作出明確的模板參數,你可以使用:
foo<int, int>(a, b);
調用第一個函數。
你可以使用:
foo<int>(a, b);
調用第二功能。
由於您讓編譯器選擇函數,因此它選擇了更具限制性的函數,即第二個函數。
爲什麼第二個更具限制性?編譯器必須推導出一種類型來使用第二個函數。它必須推出兩種類型才能使用第一種。
@πάνταῥεῖ:我不確定這與這個問題有什麼關係。 –
@OliCharlesworth我還沒有;)......認爲dyp的評論比我想表達的更好。 –
在這種情況下,兩個模板都會生成一個函數簽名'void foo(int,int)',所以它們是基於*偏序* aka *選擇的,哪一個更專用*。 – dyp