2017-04-02 1 views
3

이 경우 어떤 함수 템플리트 오버로드를 사용해야합니까?명시 적으로 어떤 템플릿 오버로드를 사용해야하는지 선택하십시오.

struct X { }; 

struct A { A(X){} }; 
struct B { B(X){} }; 

template<class T> 
void fun(T, A) { } 

template<class T> 
void fun(T, B) { } 

int main() { 
    /* explicitly choose overload */ fun(1, X()); 
} 

오류 : 정상적인 기능을 위해

error: call of overloaded 'fun(int, X)' is ambiguous 
    /* explicitly choose overload */ fun(1, X()); 
               ^
    candidate: void fun(T, A) [with T = int] 
void fun(T, A) { } 
     ^~~ 
    candidate: void fun(T, B) [with T = int] 
void fun(T, B) { } 
     ^~~ 

그것은 다음과 같습니다 가능

void fun(A){} 
void fun(B){} 

int main() { 
    ((void(*)(A))(fun))(X()); 
} 

인가? 명시 적으로 첫 번째 매개 변수 유형을 지정하지 않도록 선택하지만 여전히 (C에서 + 당신이 목적을 주조 전용 람다 함께 갈 수있는 초를 지정하려면

+0

친절하게 질문을 설명하십시오. – Weaboo

+2

'fun (1, A (X()));'??? – Pubby

+0

@Pubby 함수 형식을 변경하지 않고 함수 오버로드 (일반 함수의 경우 캐스팅 형식과 같은)를 선택했습니다. – xinaiz

답변

2

으로 시도 할 수 있습니다 +14 솔루션) :

struct X { }; 

struct A { A(X){} }; 
struct B { B(X){} }; 

template<class T> 
void fun(T, A) { } 

template<class T> 
void fun(T, B) { } 

int main() { 
    [](auto v, auto x){ static_cast<void(*)(decltype(v), A)>(fun)(v, x); }(1, X()); 
} 

[live demo]

3

귀하의 예제를 개선, 당신은

((void(*)(int, A))(fun))(1, X()); 
1

이 문제에 대한 낮은 기술 솔루션은 간접적 인 추가 레벨을 추가하는 것입니다. 그의 유일한 목적이다 fun의 첫 번째 버전에 명시 적으로 이름을주고, funA 같은 기능을 추가 : 방금 A(X())에 인수를 변경할 수없는 이유

struct X { }; 

struct A { A(X){} }; 
struct B { B(X){} }; 

template<class T> 
void fun(T, A) { } 

template<class T> 
void fun(T, B) { } 

template <class T> 
void funA(T t, A a) { fun(t, a); } 

int main() { 
    /* explicitly choose overload */ funA(1, X()); 
} 

는 그러나, 나는 궁금하다. 어쨌든 호출 코드를 변경해야하므로 문제가 무엇입니까?

관련 문제