這取決於是否存在過載(4)。
...這是由於重載一個特殊的規則:不在一些模板的特優於函數模板特,如果這些都是重載決議規則,否則無法區分功能。例如。
template <typename T>
void f(T); // A
void f(int); // B
f(4); // Calls B - Conversions of 4 to both parameter types are equivalent
這也適用於您的樣品:由於參數類型的f<int>
(1),f<int*>
(2)和f
(4)是相同的,(4)必須進行選擇。
一旦(4)消失了,在半序踢:它確定(2)是更專門的,因爲
因此來自(2)的專業化f<int>
是更好的匹配。
這取決於申報的順序(1)(2)和(3)
你聲明的名稱f
兩個函數模板重載。但是你聲明的明確的專業化可以同時適用於兩者!推導出模板參數,並且可以推導出f(T)
和f(T*)
,因爲它們都可以採用指向int
的指針。
template <class T> void f(T) {} // (1)
// Specializes f<int*> from (1), (2) not yet declared
template <> void f<>(int*) {}
template <class T> void f(T*) {} // (2)
或者
template <class T> void f(T) {} // (1)
template <class T> void f(T*) {} // (2)
// Specializes f<int> from (2)
template <> void f<>(int*) {}
在後者的情況下,(2)被選擇,因爲它比更特化的(1)(根據部分排序的規則)。您可以通過明確提供模板參數來使該專業化毫不含糊,而不是讓它們未指定:
template <>
void f<int>(int*) {} // Can only specialize (2)
謝謝您的回答!偉大的迴應。 – Kam 2015-04-03 13:33:12