我知道这可能是一个简单的问题,但我在最后一个半小时一直在努力,我真的迷失了.
这里编译错误:
- synthesized method ‘File& File::operator=(const File&)’ first required here
我有这段代码:
- 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如果在此标头中定义:
- #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是我创建的对象,它只不过是一个处理文件IO的简单接口.我以前已经完成了用户定义对象的向量,但这是我第一次遇到这个错误.
这是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 );
- }
我在linux下用gcc工作.
对不起,很长的帖子.
谢谢
解决方法
在C 03中,std :: vector< T>要求T是可复制构造和可复制分配的.文件包含标准流数据成员,标准流是不可复制的,因此File也是如此.
您的代码在C 11中可以正常工作(使用移动构造/移动分配),但是您需要避免将标准流对象按值保存为C 03中的数据成员.我建议将编译器升级到支持C 11的编译器.移动语义或使用Boost’s smart pointers之一.