考慮到這種代碼:C++函數模板特殊化和重載
template <class T>
void f(T p) { //(1)
cout << "Second" << endl;
}
template <>
void f(int *p) { //(2)
cout << "Third" << endl;
}
template <class T>
void f(T* p) { //(3)
cout << "First" << endl;
}
呼叫如int *p; f(p);
將輸出First
。
如果聲明的順序改變時,這樣的:
template <class T>
void f(T* p) { //(3)
cout << "First" << endl;
}
template <class T>
void f(T p) { //(1)
cout << "Second" << endl;
}
template <>
void f(int *p) { //(2)
cout << "Third" << endl;
}
相同的呼叫(int *p; f(p);
)將輸出Third
。
我讀到其中函數模板重載需要的地方的方式:第一分辨率只考慮非模板功能和底層的基本模板。在選擇「最專業化」之後,如果它是一個模板函數,並且對推導(或明確指定)的參數具有專門化,則調用該專業化。
現在我的問題是:如何確定哪個底層基模板的某個功能是專門化的?在我的例子中,哪個函數模板過載((1)或(3))是(2)專業化?
我的猜測是,當聲明專業化時,已經聲明瞭模板,並從那些最「專業的」(其參數與這個專業化「最接近」)被選擇。它是否正確?另外,您能否指出我在標準中指定的位置?
因此,從專業化之前聲明的模板函數中,使用偏序排序來選擇「正確的一個」? – user42768
@ user42768 - 通過模板參數推導*和*部分排序,是的。 – StoryTeller