C++ function overload -> ambiguous
Vinci 11.02.2016 - 10:43 1730 8
Vinci
hatin' on summer
|
Grüß euch Kann mir jemand erklären wieso folgendes Beispiel vom GCC (GNU ARM 5.2) als "ambiguous" gehandelt wird? foo(int a, int b);
foo(int a, int b, bool c);
void foo(int a, int b)
{
}
void foo(int a, int b, bool c)
{
}
foo(1, 2, true); // no errors
foo(1, 2); // ambiguous
Allein auf Grund der Anzahl an Parametern sollte dem Compiler doch klar sein, welche Funktion ich aufrufen will...? /edit typo
Bearbeitet von Vinci am 11.02.2016, 10:47
|
Obermotz
Fünfzylindernazi
|
Foot im Prototypen?
|
Vinci
hatin' on summer
|
Err... der Fuß is natürlich nicht dort. /edit Interessanterweise schreit a jetzt bei exakt dem Beispiel nicht... Ich hab aber 2x Funktionen die _genau_ so ausschaun und da mag a mich nicht. Außerdem is der "Error" wohl eher ein Warning, weil er beim Debuggen die zwei Aufrufe sehr wohl richtig auflösen kann. Das gibts ja nicht?
Bearbeitet von Vinci am 11.02.2016, 10:54
|
Obermotz
Fünfzylindernazi
|
Ambiguous sind eher Operatorueberladungen bzw. die Casts der Operanden, ich glaub also nicht, dass es an den Funktionen bzw. deren Prototypen liegt. Du muesstest uns den ganzen Code zeigen..
|
Vinci
hatin' on summer
|
Ambiguous sind eher Operatorueberladungen bzw. die Casts der Operanden, ich glaub also nicht, dass es an den Funktionen bzw. deren Prototypen liegt. Du muesstest uns den ganzen Code zeigen.. Nullo-Probleme: void llHsmIssueChannel(Sample* sample, double vol, double r, bool loop)
{ llhsm.issueChannel(sample, vol, r, loop);
}
void llHsmIssueChannel(Sample* sample, double vol, double r)
{ llhsm.issueChannel(sample, vol, r, sample->can_loop);
}
Diese Funktionen werden genutzt um einen Sound-Kanal zu erzeugen, der in weiterer Folge Daten aus einem Flash lädt und nach ein bisserl drauf rumrechnen abspielt. Jetzt gibts die Möglichkeit diese Sounds zu loopen, was meistens von Haus aus auch geschieht. Im Flash liegt deshalb ein simples Flag, dass aber sofern gewünscht eben vom Nutzer überschrieben werden können soll. Deshalb wird 1x ein extra bool übergeben. Die Methode .issueChannel pickt dann eigentlich nur noch die Werte auf Member jener Klasse...
|
Luka
Administrator...
|
Mir fällt auf, im Funktionsprototyp fehlt der Typ des Rückgabewertes. Meine Gcc-Version (4.9) mag das gar nicht: [b]void[/b] foo(int a, int b);
[b]void[/b] foo(int a, int b, bool c);
Bist du dir sicher, dass du einen C++ und nicht C-Compiler verwendest? z.B. bool gibt es auch in C99.
|
Vinci
hatin' on summer
|
Sry, die hatte ich in meinem Beispiel natürlich auch drin! Jaja, C++ aktueller GNU ARM. Ich verwend im selben File ziemlich heavy templates und das funktioniert alles wunderbar. Hät nicht gedacht dass sich das für kleinste Embedded Anwendungen (ich hab 96k RAM ) schon derart nutzen lässt. Wie gesagt, bei dem Anfangs geposteten Beispiel schreit er eh nicht auf, nur bei meinem Code direkt. Und auch da is es irgendwie komisch, da ich den debuggen kann... Beide Aufrufe: llHsmIssueChannel(&sample[0], 1.0, 1.0);
llHsmIssueChannel(&sample[1], 1.0, 1.0, true);
werden korrekt aufgelöst. Also kan Plan was da hat. Vor allem schreit der Compiler halt wirklich "error" und nicht "warning". Im Normalfall sollten sich ambiguous geflagte Fehler wohl eher nicht durchcompilieren lassen...? /edit Hab grad mal testweise überall an type cast gmacht... Bringt nix.
Bearbeitet von Vinci am 11.02.2016, 11:32
|
Obermotz
Fünfzylindernazi
|
Ich weiss nicht, wies bei C++ aussieht, aber ich bin nicht sicher, ob du das Array vor der Uebergabe ueberhaupt dereferenzieren musst und du koenntest deine 1.0 Literale mit f oder d annotieren..
Bearbeitet von Obermotz am 11.02.2016, 11:56
|
Vinci
hatin' on summer
|
Ich weiss nicht, wies bei C++ aussieht, aber ich bin nicht sicher, ob du das Array vor der Uebergabe ueberhaupt dereferenzieren musst und du koenntest deine 1.0 Literale mit f oder d annotieren.. Hatte ich schon spekuliert, bringt aber ebenfalls keine Besserung. /edit Habs jetzt daheim mit der Linux Version des GCC ARM compiliert und da tritt kein Fehler auf...
Bearbeitet von Vinci am 11.02.2016, 17:38
|