Ich habe an einem C ++ - Code gearbeitet, den ein Freund geschrieben hat, und erhalte den folgenden Fehler, den ich beim Kompilieren mit gcc4.6 noch nie gesehen habe:
error: use of deleted function
‘GameFSM_<std::array<C, 2ul> >::hdealt::hdealt()’ is implicitly deleted because the default definition would be ill-formed:
uninitialized non-static const member ‘const h_t FlopPokerGameFSM_<std::array<C, 2ul> >::hdealt::h’
Bearbeiten: Dies kommt aus einem Teil des Codes mit Boost MSM: Boost Webpage
Edit2: Es wird = delete()
nirgendwo im Quellcode verwendet.
Was bedeutet dieser Fehler im Allgemeinen? Worauf sollte ich achten, wenn diese Art von Fehler auftritt?
Antworten:
Die Fehlermeldung besagt eindeutig, dass der Standardkonstruktor implizit gelöscht wurde . Es heißt sogar, warum: Die Klasse enthält eine nicht statische const-Variable, die vom Standard-ctor nicht initialisiert würde.
Da dies der Fall
X::x
istconst
, muss es initialisiert werden - aber ein Standard-Ctor würde es normalerweise nicht initialisieren (da es sich um einen POD-Typ handelt). Um einen Standard-Ctor zu erhalten, müssen Sie daher selbst einen definieren (und dieser muss initialisiert werdenx
). Sie können die gleiche Situation mit einem Mitglied haben, das eine Referenz ist:Es ist wahrscheinlich erwähnenswert, dass beide auch die implizite Erstellung eines Zuweisungsoperators aus im Wesentlichen demselben Grund deaktivieren. Der implizite Zuweisungsoperator führt normalerweise eine mitgliederweise Zuweisung durch, aber mit einem const-Mitglied oder Referenzmitglied kann er dies nicht tun, da das Mitglied nicht zugewiesen werden kann. Damit die Zuweisung funktioniert, müssen Sie Ihren eigenen Zuweisungsoperator schreiben.
Aus diesem Grund sollte ein
const
Mitglied normalerweise statisch sein. Wenn Sie eine Zuweisung vornehmen, können Sie das const-Mitglied ohnehin nicht zuweisen. In einem typischen Fall haben alle Ihre Instanzen denselben Wert, sodass sie auch den Zugriff auf eine einzelne Variable gemeinsam nutzen können, anstatt viele Kopien einer Variablen zu haben, die alle denselben Wert haben.Es ist natürlich möglich, Instanzen mit unterschiedlichen Werten zu erstellen. Sie übergeben (zum Beispiel) beim Erstellen des Objekts einen Wert, sodass zwei verschiedene Objekte zwei unterschiedliche Werte haben können. Wenn Sie jedoch versuchen, sie auszutauschen, behält das const-Element seinen ursprünglichen Wert bei, anstatt ausgetauscht zu werden.
quelle
C++ error: use of deleted function
Sie verwenden eine Funktion, die als gekennzeichnet ist
deleted
.Z.B:
Das = Löschen ist eine neue Funktion von C ++ 0x. Dies bedeutet, dass der Compiler die Kompilierung sofort beenden und sich beschweren sollte, dass diese Funktion gelöscht wurde, sobald der Benutzer diese Funktion verwendet.
Wenn Sie diesen Fehler sehen, sollten Sie die Funktionsdeklaration auf überprüfen
=delete
.Um mehr über diese neue Funktion in C ++ 0x eingeführt, überprüfen Sie diese aus.
quelle
C++ error: use of deleted function
gcc 4.6 unterstützt eine neue Funktion gelöschter Funktionen, in die Sie schreiben können
um den Standardkonstruktor zu deaktivieren.
Hier hat der Compiler offensichtlich gesehen, dass ein Standardkonstruktor nicht generiert werden kann, und
=delete
das für Sie.quelle
Ich bin auf diesen Fehler gestoßen, als ich von einer abstrakten Klasse geerbt und nicht alle reinen virtuellen Methoden in meiner Unterklasse implementiert habe.
quelle
public virtual
von einer Basisklasse der 2. Ebene abgeleitet habe, in der die Basisklasse der 1. Ebene einen explizit gelöschten Standardkonstruktor hatte. Durch das Entfernen wurdevirtual
das Problem behoben, ohne dass alle Methoden implementiert werden mussten.Im aktuellen C ++ 0x-Standard können Sie Standardkonstruktoren mit der Löschsyntax explizit deaktivieren, z
Gcc 4.6 ist die erste Version, die diese Syntax unterstützt. Vielleicht ist das das Problem ...
quelle
Gcc 4.6 is the first version to support this syntax
Ich denke, das würde erklären, warum ich es noch nie gesehen habe, da ich gerade erst angefangen habe, gcc4.6 zu verwenden.Der Wechsel von gcc 4.6 zu gcc 4.8 hat dies für mich gelöst.
quelle