Warum wird mein fstream implizit gelöscht?

8

Ich arbeite mit ein paar HID-Geräten, die alle Klassen haben, die von der folgenden Basisklasse abstammen (in main.h ):

%Vor%

Hier ist eine der daraus abgeleiteten Geräteklassen ( device.h ):

%Vor%

... und ein Beispiel der Implementierung:

%Vor%

... und der Anrufer:

%Vor%

Wenn ich versuche und kompiliere, erhalte ich den folgenden Fehler:

  

main.cpp: 294: 27: error: Verwendung der gelöschten Funktion 'std :: basic_fstream :: basic_fstream (const std :: basic_fstream & amp;)'
  In der Datei von Quelle / main.cpp: 24: 0:   /usr/include/c++/4.6/fstream:761:11: Fehler: 'std :: basic_fstream :: basic_fstream (const std :: basic_fstream & amp;)' wird implizit gelöscht, weil die Standarddefinition schlecht formatiert wäre:

... und ich habe keine Ahnung warum, wahrscheinlich weil ich ziemlich neu in C ++ bin und etwas idiotisches getan habe.

Wenn ich die Argumente zurück in die Referenzen (mit & amp;) ändere, erhalte ich den folgenden Fehler:

  

/main.o :(. rodata._ZTV13MyDevice [vtable für MeinDevice] + 0x18): undefinierter Verweis auf 'MyDevice :: write (std :: basic_fstream & gt; & amp;)'

Kann jemand mir helfen, dieses Problem zu beheben?

    
Andy E 14.09.2012, 22:49
quelle

4 Antworten

17

Versuchen Sie, diese std::fstream s um Referenz herum zu werfen.

%Vor%     
WhozCraig 14.09.2012, 22:50
quelle
4

Nur zur Referenz, ich hatte den gleichen Compiler-Fehler, aber ich habe es auf eine andere Art und Weise erstellt, die mir nicht sofort klar war. Aus Gewohnheit schrieb ich:

%Vor%

Erstellt natürlich ein temporäres fstream-Objekt und kopiert es in den Stream. Das funktionierte in Xcode 6 mit clang, aber nicht für GCC 4.9.2.

    
Aaron Burghardt 13.07.2015 14:49
quelle
2

Die HIDDevice Methodensignaturen bedeuten, dass die fstream s nach Wert weitergegeben werden. Dies bedeutet wiederum, dass Kopien der ursprünglichen Stream-Objekte an der Aufrufstelle unter Verwendung des Kopierkonstruktors erstellt werden müssen. Es ist dieser Kopierkonstruktor, der die kanonische Signatur std::basic_fstream::basic_fstream(const std::basic_fstream&) hat.

Der Compiler teilt Ihnen mit, dass er aus irgendeinem Grund (der mit der von Ihrer Standardbibliothek verwendeten basic_fstream -Implementierung zu tun hat) diesen Kopierkonstruktor nicht automatisch generieren kann und daher Ihren impliziten Befehl zum Erstellen von Kopien nicht erfüllen kann der Ströme.

Wie andere bereits gesagt haben, besteht der übliche Modus operandi (der auch den Fehler hier verhindert) darin, die Argumente durch Verweis statt durch Wert zu übergeben.

    
Jon 14.09.2012 22:55
quelle
1

&std::fstream als Parameter wird es als Referenz übergeben, um überall als das gleiche Objekt verwendet zu werden. Dadurch wird vermieden, dass die Implementierung versucht, eine weitere Instanz zu erstellen und den Stream dann zu schließen, wenn die Funktionen beendet werden (weil das kopierte Objekt zerstört wird).

Stellen Sie sicher, dass Sie dies sowohl in der Deklaration als auch in der Implementierung der Member-Funktion (d. h. in der Klasse und wo der Body ist) ändern.

    
Jonathan Seng 14.09.2012 22:51
quelle

Tags und Links