Compiler returns "synthesized method ‘operator=’ first required here"

c++, gcc

Solution

In C++03, `std::vector<T>` requires that `T` be copy-constructable and copy-assignable. `File` contains standard stream data members, and standard streams are non-copyable, so consequently `File` is as well.

Your code would work fine in C++11 (with move-construction/move-assignment), but you'll need to avoid holding standard stream objects by value as data members in C++03. I recommend upgrading your compiler to one that supports C++11 move semantics or using one of Boost's smart pointers.

Problem

I know it may be a simple question, but I've been working on it for the last hour and a half and I'm really lost. Here the compiler error: ``` synthesized method ‘File& File::operator=(const File&)’ first required here ``` I have this bit of code : ``` void FileManager::InitManager() { int numberOfFile = Settings::GetSettings()->NumberOfFile() + 1; for( unsigned int i = 1; i < numberOfFile; i++ ) { std::string path = "data/data" ; path += i; path += ".ndb"; File tempFile( path ); _files.push_back( tempFile ); // line that cause the error /*if( PRINT_LOAD ) { std::cout << "Adding file " << path << std::endl; }*/ } } ``` _files if defined in this header : ``` #pragma once //C++ Header #include <vector> //C Header //local header #include "file.h" class FileManager { public: static FileManager* GetManager(); ~FileManager(); void LoadAllTitle(); private: FileManager(); static FileManager* _fileManager; std::vector<File> _files; }; ``` File is an object I created, it is nothing more than a simple interface to deal with file IO. I have already done vector of user-defined object in the past, but it's the first time I get this error. Here is the code for the File object: File.h ``` #pragma once //C++ Header #include <fstream> #include <vector> #include <string> //C Header //local header class File { public: File(); File( std::string path ); ~File(); std::string ReadTitle(); void ReadContent(); std::vector<std::string> GetContent(); private: std::ifstream _input; std::ofstream _output; char _IO; std::string _path; std::vector<std::string> _content; }; ``` File.cpp ``` #include "file.h" File::File() : _path( "data/default.ndb" ) { } File::File( std::string path ) : _path( path ) { } File::~File() { } void File::ReadContent() { } std::string File::ReadTitle() { _input.open( _path.c_str() ); std::string title = ""; while( !_input.eof() ) { std::string buffer; getline( _input, buffer ); if( buffer.substr( 0, 5 ) == "title" ) { title = buffer.substr( 6 ); // 5 + 1 = 6... since we want to skip the '=' in the ndb } } _input.close(); return( title ); } std::vector<std::string> File::GetContent() { return( _content ); } ``` I'm working under linux with gcc. Any hints or tips as to what the solution could be is appreciated. Sorry for the long post. Thanks

Original source