web-dev-qa-db-de.com

Fehler: Verwendung der gelöschten Funktion

Ich habe an einem C++ - Code gearbeitet, den ein Freund geschrieben hat, und ich erhalte die folgende Fehlermeldung, die 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-Webseite

Edit2: Es wird nirgendwo im Quellcode = delete() verwendet.

Was bedeutet dieser Fehler im Allgemeinen? Nach was soll ich suchen, wenn diese Art von Fehler auftritt?

99
shuttle87

Die Fehlermeldung besagt eindeutig, dass der Standardkonstruktor gelöscht wurde implizit. Darin steht sogar, warum: Die Klasse enthält eine nicht statische const-Variable, die vom Standard-ctor nicht initialisiert würde.

class X {
    const int x;
};

Schon seit X::x ist const, es muss initialisiert werden - aber ein Standard-Ctor würde es normalerweise nicht initialisieren (weil es ein POD-Typ ist). Um einen Standard-Ctor zu erhalten, müssen Sie diesen selbst definieren (und x initialisieren). Sie können die gleiche Situation mit einem Mitglied erhalten, das eine Referenz ist:

class X { 
    whatever &x;
};

Es ist wahrscheinlich erwähnenswert, dass beide auch die implizite Erstellung eines Zuweisungsoperators aus im Wesentlichen demselben Grund deaktivieren. Der implizite Zuweisungsoperator weist normalerweise Mitglieder zu, aber bei einem konstanten Mitglied oder Referenzmitglied ist dies nicht möglich, da das Mitglied nicht zugewiesen werden kann. Damit die Zuweisung funktioniert, müssen Sie Ihren eigenen Zuweisungsoperator schreiben.

Aus diesem Grund sollte ein const -Element normalerweise statisch sein - wenn Sie eine Zuweisung vornehmen, können Sie das const -Element ohnehin nicht zuweisen. In einem typischen Fall haben alle Ihre Instanzen den gleichen Wert, sodass sie auch auf eine einzelne Variable zugreifen können, anstatt über viele Kopien einer Variablen zu verfügen, die alle den gleichen Wert haben.

Es ist natürlich möglich, Instanzen mit unterschiedlichen Werten zu erstellen. Sie übergeben beispielsweise einen Wert, wenn Sie das Objekt erstellen, sodass zwei verschiedene Objekte zwei unterschiedliche Werte haben können. Wenn Sie jedoch versuchen, diese auszutauschen, behält das konstante Element seinen ursprünglichen Wert bei, anstatt ausgetauscht zu werden.

148
Jerry Coffin

Sie verwenden eine Funktion, die als deleted markiert ist.
Z.B:

int doSomething( int ) = delete;

= Delete ist eine neue Funktion von C++ 0x. Dies bedeutet, dass der Compiler sofort aufhören sollte zu kompilieren und sich darüber beschweren sollte, dass diese Funktion gelöscht wurde, sobald der Benutzer diese Funktion verwendet.

Wenn Sie diesen Fehler sehen, sollten Sie die Funktionsdeklaration für =delete Überprüfen.

Um mehr über diese neue Funktion in C++ 0x zu erfahren, überprüfen Sie this out.

8
Alok Save

gcc 4.6 unterstützt eine neue Funktion für gelöschte Funktionen, in die Sie schreiben können

hdealt() = delete;

um den Standardkonstruktor zu deaktivieren.

Hier hat der Compiler offensichtlich gesehen, dass ein Standardkonstruktor nicht generiert werden kann, und =delete Hat es für Sie getan.

2
Bo Persson

Der Wechsel von gcc 4.6 zu gcc 4.8 löste dies für mich.

1

Kannst du das bitte versuchen? Ich habe kein gcc-4.6

class C
  {
public:
  const int x ;
  } ;
int main()
  {
  C c ;
  }

Es sollte eine ähnliche Fehlermeldung angezeigt werden, wenn die Personen hier korrekt sind.

1
TonyK

Im aktuellen C++ 0x-Standard können Sie Standardkonstruktoren mit der Löschsyntax explizit deaktivieren, z.

MyClass() = delete;

Gcc 4.6 ist die erste Version, die diese Syntax unterstützt. Vielleicht ist das das Problem ...

1
jarmond

Ich bin auf diesen Fehler gestoßen, als ich von einer abstrakten Klasse geerbt habe und nicht alle rein virtuellen Methoden in meiner Unterklasse implementiert habe.

0
Christopher