Frage

Können Sie mir sagen, warum der folgende Code mir folgende Fehler geben - Aufruf von überladenen "C (int)" ist mehrdeutig

Ich würde denken, dass, da C (char x) ist privat, nur die C (float) Ctor von außen sichtbar ist und das sollte durch die Umwandlung int zu schweben genannt werden.

Aber das ist nicht der Fall.

class C
{
    C(char  x)
    {
    }
public:
    C(float t)
    {
    }
};

int main()
{
    C p(0);
}
War es hilfreich?

Lösung

Dies ist in "Effective C ++" von Scott Meyer diskutiert. Der Grund dafür ist nicht eindeutig ist, dass sie nur gewährleisten wollte, dass die Sichtbarkeit eines Mitglieds Ändern bereits bestehenden Code die Bedeutung anderer Stelle würde sich nicht ändern.

Ansonsten nehmen Ihre C-Klasse in einem Header irgendwo war. Wenn Sie ein privates C (int) Mitglied haben, der Code, den Sie anwesend nennen würde C (float). Wenn aus irgendeinem Grund wurde die C (int) Mitglied öffentlich gemacht, würde der alte Code plötzlich das Mitglied nennen, obwohl weder die alten Code, noch die Funktion es hatte sich verändert genannt .

EDIT: Weitere Gründe:

Noch schlimmer: Angenommen, Sie die folgenden zwei Funktionen haben:

C A::foo() 
{
    return C(1.0);
}

C B::bar() 
{
    return C(1.0);
}

Diese beiden Funktionen können verschiedene Funktionen aufrufen, je nachdem, ob entweder foo oder bar wurde als Freund von C erklärt, oder ob A oder B erbt von ihm. Mit identisch Coderuf verschiedenen Funktionen ist beängstigend.

(Das ist wahrscheinlich nicht so gut wie Scott Meyers Diskussion gestellt, aber das ist die Idee.)

Andere Tipps

0 ist ein int Typ. Denn es kann implizit in gleicher Weise auf entweder einem Schwimmer oder char gegossen wird, wird der Anruf nicht eindeutig. Die Sicht ist für diese Zwecke irrelevant.

Entweder setzen 0.0, 0. oder 0.0f oder vollständig aus dem C(char) Konstruktor loswerden.

Edit: Relevante Teil des Standard, Abschnitt 13.3:

  

3) [...] Aber, sobald die Kandidatenfunktionen und Argumentlisten identifiziert wurden, die Auswahl der besten Funktion ist in allen Fällen gleich:

     
      
  • eine Untergruppe der Kandidaten Funktionen-diejenigen Erstens, dass die richtige Anzahl von Argumenten und erfüllen bestimmte andere Bedingungen-ist so ausgewählt, eine Reihe von lebensfähigen Funktionen (13.3.2) zu bilden.
  •   
  • dann ist die beste brauchbare Funktion auf Grundlage der impliziten Konvertierungssequenzen ausgewählt ist (13.3.3.1) benötigt, um jedes Argument in dem entsprechenden Parameter jeder brauchbaren Funktion entsprechen.
  •   
     

4) Wenn eine beste tragfähige Funktion existiert und ist einzigartig, gelingt die Überladungsauflösung und erzeugt es als das Ergebnis. Andernfalls Überladungsauflösung fehlschlägt und der Aufruf ist schlecht ausgebildet. Wenn die Überladungsauflösung erfolgreich ist, und die beste tragfähige Funktion ist nicht zugänglich (Ziffer 11) in dem Kontext, in dem sie verwendet wird, wird das Programm schlecht ausgebildet ist.

Beachten Sie, dass die Sichtbarkeit nicht Teil des Auswahlprozesses ist.

Ich glaube nicht, dass:

C p(0);

wird umgesetzt:

C(float t)

Sie wahrscheinlich tun müssen, um:

C p(0.0f);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top