함수 템플릿 호출의 오버로드 확인

함수 템플릿은 같은 이름의 비 템플릿 함수를 오버로드할 수 있습니다. 이 시나리오에서 컴파일러는 먼저 템플릿 인수 추론을 사용하여 함수 템플릿을 고유한 특수화로 인스턴스화하여 함수 호출을 확인하려고 시도합니다. 템플릿 인수 추론이 실패하면 컴파일러는 인스턴스화된 함수 템플릿 오버로드와 비 템플릿 함수 오버로드를 모두 고려하여 호출을 해결합니다. 이러한 다른 오버로드는 후보 집합이라고 합니다. 템플릿 인수 추론에 성공하면 생성된 함수를 후보 집합의 다른 함수와 비교하여 오버로드 확인 규칙에 따라 가장 일치하는 항목을 결정합니다. 자세한 내용은 함수 오버로드를 참조 하세요.

예: 템플릿이 아닌 함수 선택

비 템플릿 함수가 함수 템플릿과 똑같이 일치하는 경우 다음 예제의 호출 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)

참고 항목

이름 확인
typename