関数テンプレート呼び出しのオーバーロード解決
関数テンプレートは、同じ名前のテンプレート以外の関数をオーバーロードできます。 このシナリオでは、コンパイラは最初に、テンプレート引数の推論を使用して関数呼び出しを解決し、一意の特殊化で関数テンプレートをインスタンス化しようとします。 テンプレート引数の推論が失敗した場合、コンパイラは、インスタンス化された関数テンプレート オーバーロードとテンプレート以外の関数オーバーロードの両方を考慮して呼び出しを解決します。 これらの他のオーバーロードは候補セットと呼ばれます。 テンプレート引数の推論が成功した場合、オーバーロード解決の規則に従って、生成された関数が候補セット内の他の関数と比較され、最適な一致が判断されます。 詳細については、「関数のオーバーロード」を参照してください。
例: テンプレート以外の関数を選択する
テンプレート以外の関数が関数テンプレートと同等に一致する場合は、次の例の呼び出し f(1, 1)
のように、テンプレート以外の関数が選択されます (テンプレート引数が明示的に指定されていない場合)。
// template_name_resolution9.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
void f(int, int) { cout << "f(int, int)" << endl; }
void f(char, char) { cout << "f(char, char)" << endl; }
template <class T1, class T2>
void f(T1, T2)
{
cout << "void f(T1, T2)" << endl;
};
int main()
{
f(1, 1); // Equally good match; choose the non-template function.
f('a', 1); // Chooses the function template.
f<int, int>(2, 2); // Template arguments explicitly specified.
}
f(int, int)
void f(T1, T2)
void f(T1, T2)
例: 完全一致関数テンプレートを推奨
次の例は、テンプレート以外の関数で変換が必要な場合に、完全に一致する関数テンプレートが推奨されることを示しています。
// template_name_resolution10.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
void f(int, int) { cout << "f(int, int)" << endl; }
template <class T1, class T2>
void f(T1, T2)
{
cout << "void f(T1, T2)" << endl;
};
int main()
{
long l = 0;
int i = 0;
// Call the function template f(long, int) because f(int, int)
// would require a conversion from long to int.
f(l, i);
}
void f(T1, T2)
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示