템플릿 및 모호성의 자동 반환 유형 typename T1, typename

과부하 된 템플릿 기능이 있습니다 :

template<typename T1, typename T2>
auto overMax(T1 a, T2 b)
{
    std::cout << __FUNCSIG__ << std::endl;

    return b < a ? a : b;
}

template<typename RT, typename T1, typename T2>
RT overMax(T1 a, T2 b)
{
    std::cout << __FUNCSIG__ << std::endl;

    return b < a ? a : b;
}

내가 이것을 이렇게 부르면 :

auto a = overMax(4, 7.2); // uses first template
auto b = overMax<double>(4, 7.2); // uses second template

모든 것이 완벽하게 작동하지만

auto c = overMax<int>(4, 7.2); // error

모호한 호출을 유발합니다.

int 이고, 다른 유형은 무엇입니까?



답변

RT공제 할 수 없으므로 제공하지 않을 경우에만 template<typename T1, typename T2>
auto overMax(T1 a, T2 b)
호출 할 수 있습니다.

하나의 템플릿 인수를 (부분적으로) 제공하면 두 방법 모두 실행 가능합니다.

그러나 논쟁에 따라 더 나은 후보가 될 수 있습니다.

  • 에 대한 auto b = overMax<double>(4, 7.2); // uses second template

    모두 overMax<double, int, double>overMax<double, double>가능한 있습니다.
    그러나 overMax<double, int, double>정확히 일치
    하는 반면 변환이 overMax<double, double>필요 int합니다 double.

  • 에 대한 auto c = overMax<int>(4, 7.2); // Ambiguous call

    모두 overMax<int, int, double>overMax<int, double>가능한 있습니다.
    그러나 더 잘 어울리거나 더 전문적이지 않으므로 전화가 모호합니다.


답변