Überladen der Auflösung

8

Soweit ich weiß, wird der Compiler, wenn er zwischen zwei Kandidatenfunktionen wählen will, diejenige bevorzugen, deren schwächste Übereinstimmung stärker ist. Zum Beispiel wenn ich:

%Vor%

für den folgenden Code:

%Vor%

Die zweite boo sollte bevorzugt werden, da ihre schwächste Übereinstimmung Werbung ist, während die erste eine Standard-Typ-Umwandlung ist.

Aber wenn ich versuche, es zu kompilieren (mit gcc), bekomme ich:

  

Fehler: ISO C ++ sagt, dass diese mehrdeutig sind, obwohl die schlechteste Konvertierung für die erste besser ist als die schlechteste Konvertierung für die zweite.

Irgendwelche Ideen?

    
user2668673 09.08.2013, 17:18
quelle

2 Antworten

12

Ihr Verständnis der Überladungsauflösung ist falsch. Die allgemeine Regel (wenn es mehr als ein Argument gibt) ist zu wählen eine Funktion, für die mindestens ein Argument besser ist (nicht egal wie viel besser), und keiner der anderen ist schlechter. Im Mit anderen Worten, der Compiler verarbeitet jedes Argument einzeln, Erstellen einer Reihe von "besten Übereinstimmungen" für sie. Danach dauert es die Vereinigung dieser Mengen: wenn die Kreuzung genau eins enthält Funktion, du hast gewonnen. Ansonsten ist es mehrdeutig.

    
James Kanze 09.08.2013, 17:32
quelle
0

Nehmen wir an, Sie haben die Funktion f aufgerufen. Ich denke, dass der Überladungsauflösungsprozess ist: 1. Erstellen einer Reihe von Kandidatenfunktionen. Dieser Satz von Funktionen enthält alle Funktionen mit dem Namen f, auf die von dem Punkt aus zugegriffen werden kann, an dem Sie f () aufgerufen haben. 2. Erstellen einer Reihe realisierbarer Funktionen. Diese Gruppe von Funktionen ist eine Teilmenge der Kandidatenfunktionen, für die die Anzahl der Parameter jeder funktionsfähigen Funktion mit der Anzahl der Argumente übereinstimmt, die Sie zum Aufrufen von f () verwendet haben. 3. Wählt die beste funktionsfähige Funktion aus. Die beste funktionsfähige Funktion ist diejenige, deren Parameter alle entweder implizit oder implizit im Vergleich zu allen anderen lebensfähigen Funktionen sind. Wenn es mehr oder weniger als eins gibt (nicht genau eins), wird ein Kompilierungsfehler auftreten. Das folgende Beispiel zeigt es gut:

%Vor%

Dieser Code generiert einen Kompilierungsfehler (VS) oder eine Warnung (g ++).

Folgendes wird korrekt ausgeführt (Druck 1):

%Vor%     
Eva 11.08.2013 09:21
quelle

Tags und Links