2013-04-17 4 views
0

У меня есть класс, содержащий файл ofstream, я сталкиваюсь с проблемой при использовании итератора для удаления объекта вектора объектов этого класса.с использованием итератора с вектором объектов C++

Здесь ошибка:

Error 10 error C2249: 'std::basic_ios<_Elem,_Traits>::operator =' : no accessible path to private member declared in virtual base 'std::basic_ios<_Elem,_Traits>' c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream

Код:

static vector<VOIP> calls; 
... 
for(...) 
{ 
    VOIP v = VOIP(...); 
    calls.push_back(v); 
} 
... 
for(int i = 0 ; i < calls.size() ; i++) 
{ 
    if(...) 
    { 
     vector<VOIP>::iterator it = calls.begin() + i; 
     calls.erase(it);//"?" 
     break; 
    } 
} 

Face Error C2249 поднимает от линии, любую помощь и это класс

class VOIP 
{ 
public: 
    VOIP(string SourceDirectoryPath, string startTime, signalling sig, int callerIp[], int calleeIp[], int callerPort, int calleePort); 
    VOIP(const VOIP & voip); 
    ~VOIP(void); 
    //caller and callee voice vectors 
    vector<u_char> callerVoiceVector; 
    vector<u_char> calleeVoiceVector; 
    //caller and callee voice files and path 
    ofstream callerVoiceFile; 
    ofstream calleeVoiceFile; 
    string outFilePath; 
    string log; 
    ofstream logFile; 
    string startTime; 
    string endTime; 
    string length; 
} 
"?"

прокомментированная строка в конструкторе копирования вызывает та же ошибка, то есть ошибка C2249

VOIP::VOIP(const VOIP & voip) 
    /*:calleePort(voip.calleePort), calleeVoiceFile(voip.calleeVoiceFile), calleeVoiceVector(voip.calleeVoiceVector), 
    callerPort(voip.callerPort), callerVoiceFile(voip.callerVoiceFile), callerVoiceVector(voip.callerVoiceVector), 
    callType(voip.callType), endTime(voip.endTime), length(voip.length), log(voip.log), logFile(voip.logFile), 
    outFilePath(voip.outFilePath), startTime(voip.startTime), 
    pleaseDial(voip.pleaseDial), DLHmm(voip.DLHmm)//signalings*///TODO 
{ 
    cout<<"inside copy constractor"<<endl; 
} 

VOIP::~VOIP(void) 
{ 
    callerVoiceVector.clear(); 
    calleeVoiceVector.clear(); 
    callerVoiceFile.close(); 
    calleeVoiceFile.close(); 
    logFile.close(); 
    cout<<"inside destractor"<<endl; 
} 
+3

'Ошибка лица C2249 поднимается с линии"? "'? Это не имело никакого смысла. – jalf

+1

@jalf На самом деле. Он имел в виду ошибку с кодом C2249, поднятым из этой строки 'call.erase (it); //«? »' – ardiyu07

+6

«Вектор» не может переназначить объект «VOIP», поскольку его член «ofstream» не копируется. –

ответ

1

стандартной библиотеки контейнеры требуют, в общем, что объекты, которые они содержат, могут быть копии конструктивны и скопировать назначаемый. Это значит, что они требуют доступа к конструктору копирования (в вашем случае, VOIP::VOIP(const VOIP&)) и оператору присваивания копии (в вашем случае VOIP::operator=(const VOIP&)). Если ваш класс не предоставляет их явно, эти функции автоматически генерируются вашим компилятором до тех пор, пока он может это сделать: это до тех пор, пока все члены класса также могут быть скопированы или скопированы, что не относится к VOIP, поскольку ofstream не может быть скопирован.

Тем не менее, VOIP предоставляет явный конструктор копирования, поэтому проблем нет. Вот почему vector<VOIP>::push_back(), который нуждается в конструкторе копирования, работает. К сожалению, он не предоставляет оператора присваивания копий и, как ни странно, vector<VOIP>::erase() нуждается в нем. Причина в том, что при стирании элемента из вектора все элементы после него должны быть скопированы в предыдущую позицию, чтобы заполнить пробел. И это то, что сообщает сообщение об ошибке: ofstream не может быть скопирован, потому что его базовый класс std::basic_ios<> не подлежит копированию, поэтому VOIP не подлежит копированию.

Чтобы решить вашу проблему, вы можете предоставить оператор назначения копирования для VOIP, следуя тем же идеям, которые использовались для конструктора копирования. Кстати, в C++ есть что-то, называемое правилом из трех: если класс имеет явный деструктор, конструктор копирования или оператор присваивания копии, ему обычно требуются все три из них. VOIP имеет первые два, но пропускает третий. Напишите это, и все будет хорошо.

Смежные вопросы