0

我的类包含一个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;
    }
}

面对错误 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;
}
4

1 回答 1

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有前两个,但错过了第三个。写下来,一切都会好起来的。

于 2013-04-17T11:59:08.700 回答