Errore C2440: 'inizializzazione': non può convertire da 'std :: _ Vector_iterator <_Ty, _Alloc>' di 'tipo *'
-
13-09-2019 - |
Domanda
Mi è toccato il seguente errore durante la migrazione di codice VC6 per VS2008. Questo codice funziona bene in VC6, ma dà un errore di compilazione in VC9. So che è a causa di un cambiamento compilatore di rottura. Qual è il problema e come posso risolvere il problema?
error C2440: 'initializing' : cannot convert
from 'std::_Vector_iterator<_Ty,_Alloc>'
to 'STRUCT_MUX_NOTIFICATION *'
Codice
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
}
Soluzione
Se ha funzionato prima, sto indovinando MUX_NOTIFICATION_VECTOR è un typedef
typedef std::vector<STRUCT_MUX_NOTIFICATION> MUX_NOTIFICATION_VECTOR;
L'iteratore per un contenitore spesso può essere scambiato con un puntatore (perché funziona allo stesso modo) e, nel caso di alcune implementazioni STL, in realtà può essere un puntatore (probabilmente era il caso di STL fornito con VC6 ). Ma non v'è alcuna garanzia a riguardo.
Che cosa si dovrebbe fare è la seguente:
STRUCT_MUX_NOTIFICATION& reference = *MuxNotfnIterator;
// or
STRUCT_MUX_NOTIFICATION* pointer = &(*MuxNotfnIterator);
Altri suggerimenti
Credo che questo dovrebbe fare il trucco:
STRUCT_MUX_NOTIFICATION *pstMuxNotfn = &(*MuxNotfnIterator);
È necessario dereference l'iteratore per ottenere lo struct appropriata (non so perché ha funzionato prima?):
STRUCT_MUX_NOTIFICATION *pstMuxNotfn = *MuxNotfnIterator;