2012-04-24 13 views
6

So che potrebbe essere una semplice domanda, ma ci ho lavorato per l'ultima ora e mezza e sono davvero perso.Il compilatore restituisce "metodo sintetizzato 'operator =' prima richiesto qui"

Qui l'errore del compilatore:

synthesized method ‘File& File::operator=(const File&)’ first required here 

ho questo pezzo di codice:

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 se definito in questa intestazione:

#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 è un oggetto che ho creato , non è altro che una semplice interfaccia per gestire il file IO. Ho già realizzato il vettore dell'oggetto definito dall'utente in passato, ma è la prima volta che visualizzo questo errore.

ecco il codice per l'oggetto del file: 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); 
} 

sto lavorando sotto Linux con gcc.

Qualsiasi suggerimento o suggerimento su quale sia la soluzione potrebbe essere apprezzato.

Ci scusiamo per il post lungo.

Grazie

risposta

9

In C++ 03, std::vector<T> è necessario che T sia copiabile e copiabile. File contiene membri di dati di flusso standard e gli stream standard non sono copiabili, pertanto anche File corrisponde.

Il tuo codice funzionerebbe bene in C++ 11 (con spostamento-costruzione/spostamento-assegnazione), ma dovrai evitare di mantenere gli oggetti stream standard in base al valore dei membri dati in C++ 03. Raccomando l'aggiornamento del compilatore a uno che supporti la semantica di spostamento C++ 11 o l'utilizzo di uno di Boost's smart pointers.

2

Non sono sicuro sul messaggio di errore, ma questa linea:

_files.push_back(tempFile); 

richiede che File avere un costruttore copia pubblica. Dato che hai fornito altri costruttori, devi fornire anche questo. Il compilatore non lo sintetizza.

Problemi correlati