2009-06-10 62 views
0

VC6コードをVS2008に移行する際に、次のエラーが発生します。このコードはVC6では正常に動作しますが、VC9でコンパイルエラーが発生します。私はそれがコンパイラの変更を壊すためだということを知っています。問題は何ですか?問題を解決するにはどうすればよいですか?エラーC2440: '初期化': 'std :: _ Vector_iterator <_Ty,_Alloc>'から 'タイプ*'に変換できません

error C2440: 'initializing' : cannot convert 
    from 'std::_Vector_iterator<_Ty,_Alloc>' 
     to 'STRUCT_MUX_NOTIFICATION *' 

コード

MUX_NOTIFICATION_VECTOR::iterator MuxNotfnIterator; 

for(
    MuxNotfnIterator = m_MuxNotfnCache.m_MuxNotificationVector.begin(); 
    MuxNotfnIterator != m_MuxNotfnCache.m_MuxNotificationVector.end(); 
    MuxNotfnIterator ++ 
    ) 
{ 
    STRUCT_MUX_NOTIFICATION *pstMuxNotfn = MuxNotfnIterator; //Error 2440 
} 

答えて

8

orked前に、私は推測していMUX_NOTIFICATION_VECTORは、それが実際には、いくつかのSTLの実装の場合には、(それは同じように動作するので)とコンテナのイテレータは、多くの場合、ポインタと誤解されることが

typedef std::vector<STRUCT_MUX_NOTIFICATION> MUX_NOTIFICATION_VECTOR; 

のtypedefでありますポインタとなります(おそらく、VC6で提供されるSTLの場合でした)。しかし、それについての保証はありません。私の仮説が正しいか

STRUCT_MUX_NOTIFICATION& reference = *MuxNotfnIterator; 
// or 
STRUCT_MUX_NOTIFICATION* pointer = &(*MuxNotfnIterator); 
+0

はい、Typedefです...あなたの宣言は完璧です。 あなたの推論は正しいようです。 +1。 誰かが詳細な説明をしていない限り、正しい答えとしてマークしてください。 Benoitありがとうございます。 – bobbyalex

1

あなたは適切な構造体(それは前に働いていた理由はわからない?)を取得するイテレータを間接参照する必要があります:私はこれが何をすべきだと思う

STRUCT_MUX_NOTIFICATION *pstMuxNotfn = *MuxNotfnIterator; 
+0

場合は、あなたが示唆するものは動作しません。

は何をすべきことは次のようです。 –

4

をトリック:

STRUCT_MUX_NOTIFICATION *pstMuxNotfn = &(*MuxNotfnIterator); 
+0

+1これは動作します。しかし、私はまだそれがなぜ以前に働いたのか、今はなぜそうではないのかについての答えが必要です。実際の詳細。 また、VC7以降のイテレータに関してSTLに大きな変化があることも読んでいます。 – bobbyalex

+0

コードが間違っていた場合、ベクターイテレーターがポインターであると仮定した場合のように、 "壊れた"変更があります。 VC6はC++ 98標準と正確には一致しませんでした(これは数ヶ月が古いためです)。 VC7は標準にさらに近づき、さらにデバッグオプションを追加します。よりスマートなイテレータが役立ちます。それらは依然として標準的な要件を満たしていますが、濫用する方がより堅牢です。 – MSalters

関連する問題