考慮下面的代碼來選擇模板版本:C++函數分辨率通過純函數
#include <iostream>
template<typename T>
void f(T t)
{
(void)t;
std::cout << "templated f(T)\n";
}
template<typename T>
void entry(T t)
{
f(t);
}
void f(double d)
{
(void)d;
std::cout << "normal f(double)\n";
}
int main()
{
double d = 0.0;
entry(d);
return 0;
}
輸出:
模板化的F(T)
我發現這個令人驚訝的,因爲我認爲普通功能將在任何模板版本上進行選擇。爲什麼會發生?
另一件事我而玩弄注意到的是:如果我把正常功能void f(double)
模板化void entry(T)
函數的代碼將正常調用函數之前,基本上輸出:
正常F(雙)
因此,我的另一個問題:爲什麼順序在這個特殊的例子?
ok,...但是我注意到,模板內部的查找會在模板的聲明之後找到一個名稱,如果它是另一個模板,甚至是具有基本類型(如「double」)的模板的特化。我通過將普通函數更改爲一個專門的模板來檢查它:'template <> void f(double)'。結果是被調用的專用模板,即使它已經超過了調用代碼的聲明點。 – Edenbridge
@Edenbridge名稱查找始終會查找主模板。專業匹配發生在名稱查找之後,並且具有不同的規則:如果在聲明最佳匹配部分專業化之前實例化模板,那麼程序不合格,不需要診斷。如果您有任何疑問,請發表一個單獨的問題。 – Brian