2012-12-16 2 views
4

다음 함수 선언을 고려 : 나는 MyClass와 전혀 관계가있는 유형 f를 호출 할 경우기능 오버로드 및 템플릿 공제 우선 순위

template<typename T> f(const T& x); // Version 1 
template<typename T1, typename T2> f(const MyClass<T1, T2>& x); // Version 2 

을, 첫 번째 버전이 호출됩니다. MyClass 유형 (템플릿 매개 변수 유형이 무엇이든)으로 f을 호출하면 두 번째 버전이 호출됩니다. 그러나 이제는 다음을 고려하십시오.

template<typename T1, typename T2, typename T3> 
MyDerivedClass : public MyClass<T1, T2> {}; 

MyDerivedClass 유형에 대해 어떤 버전의 함수가 호출됩니까?

+3

최초 변환은 파생 변환을 필요로하지 않으므로 더 잘 일치합니다. –

답변

5

표준의 13.3 절에서 처리됩니다. 문단 13.3/1은 다음과 같이 명시하고있다 :

이러한 각각의 컨텍스트는 후보 함수 세트와 고유 한 방식으로 인수 목록을 정의한다. 그러나 후보 함수 의 함수와 인수 목록이 확인되면 최상의 함수 인 의 선택은 모든 경우에서 동일합니다. - 먼저 후보 함수의 하위 집합 - 적절한 인수를 가지며 이 충족되는 함수 특정 다른 조건들 -은 실행 가능한 집합 (13.3.2)을 형성하도록 선택된다. - 그런 다음 각 실행 가능한 함수의 해당 매개 변수에 각 인수를 일치시키는 데 필요한 암시 적 변환 시퀀스 (13.3.3.1)에 대해 을 기반으로 최상의 실행 가능 함수가 선택됩니다.

첫 번째 것은 암시 적 변환을 필요로하지 않으므로 더 잘 일치합니다.

+0

SFINAE는 A를 차단하기 위해 수행 할 수 있으며 템플릿에 태그 클래스를 추가하면 쉽습니다. – Yakk