2013-10-21 3 views
1

내가 가지고 2 과부하 기능 템플릿 : szab(1, 1); :이 같은 함수를 호출 할 때오버로드 함수 템플릿

template <class typ1, class typ2> 
void szab(typ1, typ2) {cout << "2 typy" << endl;} 

template <class typ1> 
void szab(typ1, typ1) {cout << "1 typ" << endl;} 

왜 모호함이 없다? 제 2 템플릿은 첫 번째 버전의 특별한 버전입니까? 템플릿에 2 개의 매개 변수를 선언하면 다른 유형이어야한다는 의미는 아닙니다. 왜 컴파일러는 두 번째 템플릿을 선택합니까?

답변

4

두 번째 것은 "더 특수한 템플릿"이며 "대체"가 덜 필요하고 컴파일러는 과부하 해결 단계에서 최상의 선택으로 컴파일러를 선택합니다.

당 §14.5.6.2 (기능 템플릿의 부분 순서)

부분 순서 선택 차례로 각 서식을 변환하여 다른보다 전문화 두 개의 기능 템플릿 ( 다음 문단 참조) 함수 유형을 사용하여 템플릿 인수 공제를 수행합니다. 공제 프로세스는 템플릿 중 하나가 다른 템플릿보다 특수화되어 있는지 여부를 결정합니다. 그렇다면 특수 서식 파일은 부분 주문 프로세스에 의해 선택된 템플릿입니다.

+1

관련 항목 : [over.match.best]/1 (부분 순서 지정 규칙을 사용하여 두 개의 함수 템플릿 중 어느 것이 더 나은지 * 몇 가지 인수를 결정하는 데 사용됨) 및 [temp.over]/1 (이름 확인에서 과부하 선택까지의 단계 지정). – dyp