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;
    }
}

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;
}
4

1 に答える 1

1

一般に、標準ライブラリ コンテナーでは、コンテナーに含まれるオブジェクトがコピー構築可能であり、コピー割り当て可能である必要があります。つまり、コピー コンストラクター (あなたの場合はVOIP::VOIP(const VOIP&)) とコピー代入演算子 (あなたの場合はVOIP::operator=(const VOIP&)) へのアクセスが必要です。クラスがそれらを明示的に提供しない場合、これらの関数は、可能な限りコンパイラによって自動的に生成されます。これは、すべてのクラスメンバーがコピー構築可能またはコピー代入可能でもある限りですVOIPofstreamコピーできません。

それにもかかわらず、VOIP明示的なコピー コンストラクターを提供するため、問題はありません。vector<VOIP>::push_back()これが、コピー コンストラクターを必要とする が機能する理由です。残念ながら、それはコピー代入演算子を提供しておらず、奇妙に思えるかもしれませんが、それがvector<VOIP>::erase()必要です。その理由は、ベクターから要素を消去する場合、ギャップを埋めるために、それ以降のすべての要素を前の位置にコピーする必要があるためです。そして、これはエラーメッセージがあなたに伝えていることです:ofstreamその基本クラスstd::basic_ios<>はコピー可能ではないため、コピー可能でVOIPはありません。

問題を解決するためVOIPに、コピー コンストラクターに使用したのと同じアイデアに従うためのコピー代入演算子を提供することができます。ちなみに、C++ には3 の規則と呼ばれるものがあります。クラスに明示的なデストラクタ、コピー コンストラクタ、またはコピー代入演算子がある場合、通常はそれらの 3 つすべてが必要です。VOIP最初の 2 つがありますが、3 番目がありません。それを書いて、すべてがうまくいくでしょう。

于 2013-04-17T11:59:08.700 に答える