Danke chris kommentiert in Funktion Überladen Beitrag Der Abzug von Vorlagenargumenten berücksichtigt keine Conversions. Ein Vorlagenparameter kann nicht mit zwei Typen übereinstimmen
So std::min
fehlgeschlagen.
Warum <
funktioniert?
Weil das integrierte <
Numerische Werbeaktionen und das Argumentabzug für die Vorlage nicht zutrifft t.
Wie in anderen Antworten erklärt, liegt der Grund darin, dass std::min
erfordert, dass die Typen der Argumente identisch sind, wenn der Abzug ausgeführt werden soll, während <
die üblichen arithmetischen Konvertierungen (§5.9 / 2) voraussetzt Stellen Sie sicher, dass die Typen in einen "gemeinsamen Nenner" konvertiert werden. Beachten Sie, wie §13.6 / 12 eingebaute Operatoren als Kandidaten aufführt:
Für jedes Paar der beworbenen arithmetischen Typen
%Vor%L
undR
existiert ein Paar Kandidatenoperatorfunktionen des Formularswobei
LR
das Ergebnis der üblichen arithmetischen Konvertierungen zwischen ist TypenL
undR
.
Eigentlich sollte std::min
in der Lage sein, mit verschiedenen Typen umzugehen. Das Folgende ist ein modernerer Ansatz:
Demo .
Dies liegt daran, dass std::min
eine Vorlagenfunktion ist.
%Vor%
Die Argumente müssen denselben Typ haben, aber wenn Sie (a<b)
verwenden, könnte a
implizit in ein long long
Primitive Typen überladen Operatoren nicht, daher werden übliche arithmetische Konvertierungen angewendet und Ihr int wird in ein langes long konvertiert, und das "& lt;" hat eine gültige Bedeutung.
Sie können Operatoren nicht einmal für primitive Typen überladen: Ссылка
Beispiel, um zu zeigen, dass Ihr int zu long long hochgestuft wurde
%Vor%Dokumentation Ссылка
Für die binären Operatoren (außer Verschiebungen), wenn die umgesetzten Operanden haben verschiedene Arten, zusätzliche Reihe von impliziten Konvertierungen ist angewendet, bekannt als übliche arithmetische Konvertierungen mit dem Ziel, erzeuge den allgemeinen Typ (auch über den Typ std :: common_type zugänglich) Merkmal)
Tags und Links c++ templates overloading