Przy następujących szablony funkcyjne:Dlaczego kompilator nie wybiera przeciążenia szablonu funkcji w poniższym przykładzie?
#include <vector>
#include <utility>
struct Base { };
struct Derived : Base { };
// #1
template <typename T1, typename T2>
void f(const T1& a, const T2& b)
{
};
// #2
template <typename T1, typename T2>
void f(const std::vector<std::pair<T1, T2> >& v, Base* p)
{
};
Dlaczego jest to, że następujący kod zawsze wywołuje przeciążenia nr 1 zamiast przeciążeniem # 2?
int main()
{
std::vector<std::pair<int, int> > v;
Derived derived;
f(100, 200); // clearly calls overload #1
f(v, &derived); // always calls overload #1
return 0;
}
Biorąc pod uwagę, że drugi parametr f
to rodzaj pochodzi z Base
, miałem nadzieję, że kompilator wybrałby przeciążeniem nr 2, ponieważ jest to lepszy mecz niż typu rodzajowego przeciążenie # 1.
Czy są jakieś techniki, których można użyć do przepisania tych funkcji, aby użytkownik mógł napisać kod wyświetlany w funkcji main
(tj. Wykorzystując dedukcję argumentów typu kompilator)?
Chociaż nie ma to związku z głównym pytaniem, nadal: 1. "int main()", proszę. 2. Po definicjach funkcji szablonu pojawiają się puste deklaracje ";". Jest to nielegalne w C++. – AnT