2012-08-14 2 views
0

에 함수 템플릿에 전달할 때 나는 다음과 같은 코드가 있습니다 baz에 통과 할 때 제대로 foo 작품과부하 해상도가 다른 함수

template<typename T> 
void bar(int x, T y) 
{ 
} 

void baz(int x, int y) 
{ 
} 

template<typename T0, typename T1> 
void foo(void k(T0, T1), T1 t) 
{ 
} 

int main() 
{ 
    foo(baz, 10); // OK 
    foo(bar, 10); // ERROR 
    return 0; 
} 

과부하 해상도를. 그러나 함수 템플릿 bar을 전달할 때 컴파일러는 bar이 하나만 있더라도 T0foo 인 것으로 추론 할 수 없으며 첫 번째 인수는 int으로 완전히 확인됩니다. foo(bar, 10)과 같은 호출을 컴파일러가 해결할 수 있도록 함수 템플릿 foo을 작성하려면 어떻게해야합니까?

답변

0

14.8.2.1/6 (함수 호출에서 템플릿 인수를 추론 )이 응답 :

P이 멤버 함수 유형 함수 유형, 유형을 작동하려면 포인터 또는 포인터 :

  • 인수가 하나 이상의 함수 템플릿을 포함하는 오버로드 집합이면 매개 변수는 추론되지 않은 컨텍스트로 처리됩니다. 귀하의 경우에는

, bar는 함수 템플릿, 따라서 인수 k 누구의 과부하 설정 기능 템플릿이 포함되어 함수 타입이다. 따라서 bar<T>의 템플릿 인수는 추론 할 수 없습니다.

실제 이유는 foo(bar<int>, 10)foo(bar<long>, 10) 모두 모두 실행 가능한 호출이며, 암시 적으로 선택하지 않았다고 생각하십시오. 정수 리터럴 유형은 값인에 따라 달라지며 foo(bar, 10)foo(bar, 100000000)이 서로 다른 템플릿 특수화를 생성하면 이상합니다.

+0

예, 내 현재의 예는 비 추론 될 이유에 대한 이유를 이해합니다. 제 질문은 함수 템플릿'foo'를 다시 쓰는 방법 이었습니까? 즉, 호출 사이트가 아닌 함수 정의 사이트에서 컴파일러를 제공하여 도움이 될 수 있도록 도와 줄 수 있습니까? 인수로서의 함수 템플릿은 전례가 없습니다. 예를 들어'std :: endl'은 함수 템플릿입니다. – keveman

+0

@keveman "_ 예를 들어, std :: endl은 함수 템플릿입니다."그러나'basic_ostream :: operator <<'는 아닙니다! – curiousguy

0

당신은 할 수 있습니다 :

void (&b)(int,int) = bar; 
    foo(b, 10);