Was bedeutet?

92

Ich habe 2 Klassen:

class base {
    virtual void foo() {};
};

class derived : public base {
    void foo() { base::foo(); }
};

Ich habe einen Fehler gemacht und base:foo();stattdessen geschrieben base::foo();. Der Code wurde kompiliert und ausgeführt, aber fehlerhaft.

Ich weiß nicht, wie ich es googeln kann und weiß nicht, was es ist, aber ich bin sehr interessiert: Was bedeutet das?

base:foo();

Falls es wichtig ist:

class base : public QAbstractGraphicsShapeItem
Railmisaka
quelle
32
Es ist ein Etikett .
Chris
20
Dies ist ein Fall, in dem das Einschalten von Warnungen hilft, es live zu sehen ... warning: label 'base' defined but not used [-Wunused-label]... vielleicht müssen wir diese Frage-Seite hinzufügen: Haben Sie versucht, Warnungen
einzuschalten
6
Das endete mit einem Stapelüberlauf. Wie passend!
Laurent LA RIZZA

Antworten:

125
void foo() { base:foo(); }

ist äquivalent zu:

void foo()
{
   base: // An unused label.
   foo(); // Calls the function again, resulting in infinite recursion.
}

Aufgrund der unendlichen Rekursion verursacht die Funktion einen Stapelüberlauf.

R Sahu
quelle
1
Ja, ich habe diesen Fehler gefunden, als ich viele Aufrufe foo()im Aufrufstapel gesehen habe. danke
railmisaka
Gibt es dafür Warnungen in gcc / clang etc.?
Nonsensation
10
@Serthy, Wenn ich benutze -Wall, erhalte ich die Warnmeldung: socc.cc:3:4: Warnung: Label 'base' definiert, aber nicht verwendet [-Wunused-label] base: // Ein nicht verwendetes Label.
R Sahu
10
@Serthy: IIRC Visual Studio hat hierfür die Warnung "rekursiv auf allen Steuerpfaden".
MSalters