"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

C++ function overload -> ambiguous

Vinci 11.02.2016 - 10:43 1730 8
Posts

Vinci

hatin' on summer
Registered: Jan 2003
Location: Wien
Posts: 5821
Grüß euch

Kann mir jemand erklären wieso folgendes Beispiel vom GCC (GNU ARM 5.2) als "ambiguous" gehandelt wird?

Code: CPP
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...? :confused:


/edit
typo
Bearbeitet von Vinci am 11.02.2016, 10:47

Obermotz

Fünfzylindernazi
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
Foot im Prototypen? :D

Vinci

hatin' on summer
Registered: Jan 2003
Location: Wien
Posts: 5821
Err... der Fuß is natürlich nicht dort. :D


/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
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
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
Registered: Jan 2003
Location: Wien
Posts: 5821
Zitat von Obermotz
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:

Code: CPP
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
...
Avatar
Registered: Nov 2006
Location: Mödling
Posts: 206
Mir fällt auf, im Funktionsprototyp fehlt der Typ des Rückgabewertes. Meine Gcc-Version (4.9) mag das gar nicht:

Code: CPP
[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
Registered: Jan 2003
Location: Wien
Posts: 5821
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 :p) 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:
Code: CPP
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. :D
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. :D
Bearbeitet von Vinci am 11.02.2016, 11:32

Obermotz

Fünfzylindernazi
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
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
Registered: Jan 2003
Location: Wien
Posts: 5821
Zitat von Obermotz
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. :D


/edit
Habs jetzt daheim mit der Linux Version des GCC ARM compiliert und da tritt kein Fehler auf... :p
Bearbeitet von Vinci am 11.02.2016, 17:38
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz