[英]using iterator with a vector of objects c++
我有一個類包含一個ofstream
文件,使用迭代器刪除該類對象向量的對象時遇到問題。
這是錯誤:
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;
}
通常,標准庫容器要求它們包含的對象可以是可復制構造的和可復制分配的。 這就是說,它們需要訪問副本構造函數(在您的情況下為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
有前兩個,但沒有第三個。 寫出來,一切都會好起來的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.