1

もともとMicrosoftVisualStudio(VS)2003で記述されたC++コードをVS2008でコンパイルしようとしていますが、char配列の先頭にvector::iteratorを割り当てるための効率的な解決策を見つけるのに問題があります。イテレータが単純なポインタ型(T *)として定義されていたものから、VS2003とVS2005の間のクラス型に変わったことを知っています。これが私が話していることの簡単な例です。

typedef std::vector<char>       CharContainer;
typedef CharContainer::iterator InputIt;

int FindNumMsgs( InputIt _inputIter, int _len );

int ProcessBufferForMsgs( char buf[], const size_t maxlen )
{
    int numMsgs = FindNumMsgs( InputIt(buf), maxlen );
    ...
}

したがって、VS 2003では、これは問題なくコンパイルおよび動作します(イテレータはT *として定義されているため)。VS 2008では、bufポインターを使用してイテレーターを割り当てることができなくなったため、C2440(function-style-cast)でこのエラーが発生しました。イテレータがクラスタイプになったので、これをVS 2008で機能させるにはどうすればよいですか?バッファーをベクターにコピーしてからmyVec.begin()を渡すこともできますが、このオーバーヘッドを回避できると考えなければなりません。

4

4 に答える 4

1

適切な解決策はFindNumMsgs、イテレーターまたはポインターのいずれかで機能するようにテンプレート化することです(ポインターはイテレーターとして問題なく使用できるため)。このようなもの:

template <class T>
int FindNumMsgs(T it, int count) {
    while(count--) {
        // do whatever
        it++;
    }
    return n;
}
于 2009-10-19T17:16:01.290 に答える
0

FindNumMsgs最初のパラメーターとしてを受け入れる場合はchar*、単純なchar*ポインターを使用できます。

int ProcessBufferForMsgs( char buf[], const size_t maxlen )
{
    char* simpleIterator = buf;
    int numMsgs = FindNumMsgs( simpleIterator, maxlen );
    ...
}
于 2009-10-19T16:16:50.737 に答える
0

FindNumMsgsの署名は何ですか?char *が必要な場合は、。に置き換えることができInputIt(buf)ますbuf。そうでない場合は、FindNumMsgsを変更せずにできることはほとんどありません。

于 2009-10-19T16:35:54.930 に答える
0

リファクタリングする時間です。FindNumMsgsを変更して、(const?)char *を入力として受け取るか、2番目のオーバーロードされたバージョンを提供する必要があります。さらに、イテレータまたはポインタのセマンティクスを使用して、開始/終了のペアを取得するテンプレート化された関数にすることをお勧めします。

于 2009-10-19T16:47:53.067 に答える