Error C2440: 'Inicialización': no se puede convertir de 'std :: _ vector_iterator <_ty, _alloc>' a 'tipo *'
-
13-09-2019 - |
Pregunta
Recibo el siguiente error al migrar el código VC6 a VS2008. Este código funciona bien en VC6 pero ofrece un error de compilación en VC9. Sé que se debe a un cambio de ruptura del compilador. ¿Cuál es el problema y cómo lo soluciono?
error C2440: 'initializing' : cannot convert
from 'std::_Vector_iterator<_Ty,_Alloc>'
to 'STRUCT_MUX_NOTIFICATION *'
Código
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
}
Solución
Si funcionó antes, supongo que mux_notification_vector es un typedef
typedef std::vector<STRUCT_MUX_NOTIFICATION> MUX_NOTIFICATION_VECTOR;
El iterador de un contenedor a menudo se puede confundir con un puntero (porque funciona de la misma manera) y, en el caso de algunas implementaciones de STL, en realidad puede ser un puntero (probablemente fue el caso con STL provisto de VC6). Pero no hay garantía sobre eso.
Lo que debes hacer es lo siguiente:
STRUCT_MUX_NOTIFICATION& reference = *MuxNotfnIterator;
// or
STRUCT_MUX_NOTIFICATION* pointer = &(*MuxNotfnIterator);
Otros consejos
Creo que esto debería hacer el truco:
STRUCT_MUX_NOTIFICATION *pstMuxNotfn = &(*MuxNotfnIterator);
Deberá desreferencia al iterador para obtener la estructura apropiada (¿no está seguro de por qué funcionó antes?):
STRUCT_MUX_NOTIFICATION *pstMuxNotfn = *MuxNotfnIterator;