C/C++-Fehler beheben: call of overloaded 'abs(uint32_t)' is ambiguous
Problem:
Sie versuchen, ein C/C++-Programm zu kompilieren, aber Sie sehen eine Fehlermeldung wie
src\main.cpp:127:21: error: call of overloaded 'abs(uint32_t)' is ambiguousdie sich auf eine Zeile wie
long timedelta = abs(millis() - startTime);Lösung
Wandeln Sie das Argument von abs() in int oder einen anderen geeigneten Typ um:
long timedelta = abs(((int)millis() - startTime));Das sollte den Fehler beheben.
Der Grund für die Fehlermeldung ist, dass millis() und startTime beide vorzeichenlose Ganzzahlen (uint32_t) sind, daher ist ihre Differenz (millis() - startTime) ebenfalls ein uint32_t. Es ergibt jedoch keinen Sinn, abs() einer vorzeichenlosen Ganzzahl zu berechnen, da der absolute Wert einer vorzeichenlosen Ganzzahl immer gleich dem Eingabeargument ist.
Dann versucht der Compiler, den uint32_t in einen Typ umzuwandeln, der mit abs() kompatibel ist, wie int, float, double, … aber er weiß nicht, in welchen dieser Typen er ihn umwandeln soll.
Mit call of overloaded abs() teilt Ihnen der Compiler mit, dass es mehrere Argumenttypen gibt, mit denen Sie abs() aufrufen können, einschließlich int, float, double, … - eine Funktion mit demselben Namen, aber unterschiedlichen Argumenttypen wird als überladen bezeichnet.
Mit is ambiguous teilt der Compiler Ihnen mit, dass er nicht weiß, welche dieser Varianten von abs() er aufrufen soll.
Beachten Sie, dass der Compiler nicht weiß, dass alle überladenen Varianten von abs() grundsätzlich dasselbe tun, daher wird er Ihren uint32_t nicht einfach in einen beliebigen Typ umwandeln. Außerdem gibt es kleine Details in der Funktionsweise der abs()-Varianten - zum Beispiel führt float abs(float) eine andere Berechnung durch als double abs(double), da es mit 32-Bit-Gleitkommazahlen (float) statt mit 64-Bit-Gleitkommazahlen (double) rechnet.
Daher kann der Compiler nicht einfach annehmen, dass sie alle gleich sind und es keine Rolle spielt, welche er aufruft, obwohl sie dieselbe zugrunde liegende mathematische Operation darstellen