Ich habe eine Funktion geschrieben, die einen std::map mit zwei beliebigen Typen als Eingabe akzeptiert und eine Variable mit dem ersten Typ als Ausgabe zurückgibt. Das folgende Beispiel funktioniert und kompiliert erfolgreich: ``` std::map <std::string, int> map1; map1["apple"] = 1; string key1 = getkey(map1, 1); `` Das Folgende funktioniert nicht: ``` std::map <int, std:::string> map2; map2[1] = "apple"; int key2 = getkey(map2, "apple"); `` Der Compiler sagt, dass er die von der Karte verwendeten Typen nicht ableiten kann. Was ist die Ursache dafür?
Die Ursache dafür ist, dass der Schablone-Argument-Abzug für Funktionen nicht funktioniert, wenn sich die Argumente in der Parameterliste für die beiden Funktionsaufrufe in verschiedenen Positionen befinden. Im ersten Beispiel ist der Schlüsseltyp std::string und der Werttyp int, so dass der Schablone-Argument-Abzug korrekt feststellen kann, dass T std::string und U int ist. Im zweiten Beispiel ist der Schlüsseltyp int und der Werttyp ist std::string, so dass der Abzug fehlschlägt, weil die Typen in einer anderen Reihenfolge sind. Um dies zu beheben, können Sie die Schablone-Argumente für den Funktionsaufruf explizit angeben: ```c++ int key2 = getkey <int, std:string>(map2, "apple"); ``` Alternativ können Sie die Reihenfolge der Schablone-Parameter in der Funktionsdefinition neu anordnen, um die Reihenfolge der Typen in der Karte zu treffen: ``c++ templatename <typename T, typename U>T getkey(const std:map<T, U>&