Also, hier ist ein grundlegender Code, der meine Frage veranschaulicht:
%Vor%Wir haben 2 Überladungen für eine Funktion mit einer anderen Anzahl von Parametern. Dann versuche ich die Einzelparameterversion in einem Funktor zu drehen. Natürlich habe ich folgenden Fehler:
%Vor% Ich weiß, ich könnte einfach func
und damit fertig sein , aber es hat mich dazu gebracht zu denken, warum ist das mehrdeutig ? Keine der beiden Versionen von std::ptr_fun
hat Standardparameter in den Template-Definitionen, und ich habe explizit gesagt, dass die beiden Template-Parameter int
sind.
In der Tat, wenn ich einfach mache, was der Compiler im Wesentlichen während der Template-Instanziierungszeit tut:
%Vor%Es kompiliert einfach gut, irgendwie ist die Ambiguität weg! Wer hat irgendeinen Einblick, warum das der Fall ist?
Wenn Sie eine Template-Funktion aufrufen, müssen Sie keine Template-Parameter angeben, die vom Typ der Funktionsargumente abgeleitet werden können. Daher gibt der Aufruf von std::ptr_fun<int, int>
nicht wirklich an, welche der std::ptr_fun
-Überladungen Sie aufrufen, und hängt von der Funktion ab, die Sie als Argument für die Auflösung übergeben. Da Ihre func
Überladungen aufweist, die für beide std::ptr_fun
Überladungen passen, gibt es Mehrdeutigkeiten.
Bearbeiten: Hier ist ein Beispiel, um meinen Punkt zu demonstrieren - lief auf Ideone , es zeigt, dass beide Funktionsaufrufe den gleichen Typ zurückgeben.
%Vor%