====== 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::basic_ofstream(const std::basic_ofstream&)' 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\\ --- //[[feedback.jk-wiki@kreick.de|: Jürgen Kreick]]// EOF