Es gelten folgende Funktionsschablonen:Warum wählt der Compiler im folgenden Beispiel nicht meine Überladung von Funktionsvorlagen aus?
#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)
{
};
Warum ist es, dass der folgende Code Überlastung # 1 statt Überlastung # 2 immer ruft?
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;
}
Da der zweite Parameter von f
eine Art von Base
abgeleitet ist, ich habe gehofft, dass die Compiler Überlastung # wählen würde, 2, da es eine bessere Übereinstimmung als die Gattung Überlastung # 1 ist.
Gibt es irgendwelche Techniken, die ich verwenden könnte, um diese Funktionen neu zu schreiben, so dass der Benutzer Code wie in der main
-Funktion angezeigt schreiben kann (d. H. Mithilfe von Compiler-Abzug von Argumenttypen)?
Obwohl es nichts mit der Hauptfrage zu tun hat, immer noch: 1. 'int main()', bitte. 2. Auf Ihre Vorlagenfunktionsdefinitionen folgen leere Deklarationen ';'. Dies ist in C++ illegal. – AnT