Initialisierung eines Objekts bei dessen Deklaration
Bei der Deklaration eines Objekts mit gleichzeitiger Initialisierung kommt gelegentlich (zumindest beim Kompilieren mit GCC) zu den (auf den ersten Blick) seltsamen Fehlermeldungen.
Ein Beispiel:
void eine_klasse::eine_methode(const string& filepath) { auto file = std::ofstream(filepath, std::ios_base::trunc); file << "Hier wird irgendwas in das File geschrieben..."; file << std::endl; }
Hier wird das Objekt file deklariert und gleich durch den Konstruktor ofstream(const string& filename, ios_base::openmode mode = ios_base::out) (C++11) initialisiert. Der GNU-Compiler erzeugt dabei ein temporäres Objekt und ruft anschließend den Copy-Constructor ofstream(const ofstream&) des zu erzeugendes Objekts auf. Der ist jedoch in der STL als deleted definiert (Quelle: http://www.cplusplus.com/reference/fstream/ofstream/ofstream/):
// default (1) ofstream(); // initialization (2) explicit ofstream (const char* filename, ios_base::openmode mode = ios_base::out); explicit ofstream (const string& filename, ios_base::openmode mode = ios_base::out); // copy (3) ofstream (const ofstream&) = delete; // move (4) ofstream (ofstream&& x);
Der Compiler beschwert sich dabei:
ein_file.cpp: In member function 'void eine_klasse::eine_methode(const string&)': ein_file.cpp:127:69: error: use of deleted function 'std::basic_ofstream<char>::basic_ofstream(const std::basic_ofstream<char>&)' auto file = std::ofstream(filepath, std::ios_base::trunc); ^
Beim genaueren Hinsehen fällt auf, dass die als deleted angegebene Funktion nicht die ist, die man erwartet (s. die nächste Zeile).
Abhilfe schafft man, wenn man explizit den Konstruktor des zu erzeugendes Objekts aufruft:
void eine_klasse::eine_methode(const string& filepath) { std::ofstream file(filepath, std::ios_base::trunc); }
Stand: 29.02.2016
— : Jürgen Kreick
EOF