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の解像度は非テンプレート関数と基礎となるテンプレートを検討します。 "最も特殊化された"ものが選択された後、それがテンプレート関数であり、推論された(または明示的に指定された)パラメータのための特殊化を有する場合、その特殊化が呼び出される。
私の質問は次のとおりです。基底テンプレートの機能は特化ですか?私の例では、関数テンプレートのオーバーロード((1)または(3))は(2)特殊化ですか?
私はスペシャライゼーションが宣言されると、既に宣言されたテンプレートが考慮され、最も特殊な(このスペシャライゼーションに「最も近い」)パラメータが選択されると推測します。これは正しいです?また、標準で指定されている場所を教えてください。
したがって、特殊化前に宣言されたテンプレート関数から、部分順序を使用して「正しいもの」が選択されますか? – user42768
@ user42768 - テンプレート引数の控除*と*部分的な順序付けによって、はい。 – StoryTeller