2009-06-10 7 views
0

Je reçois l'erreur suivante lors de la migration du code VC6 vers VS2008. Ce code fonctionne bien dans VC6 mais donne une erreur de compilation dans VC9. Je sais que c'est à cause d'un changement de compilation du compilateur. Quel est le problème et comment le réparer?erreur C2440: 'initialisation': impossible de convertir 'std :: _ Vector_iterator <_Ty,_Alloc>' en 'type *'

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

code

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 
} 

Répondre

8

Si prestées avant, je devine MUX_NOTIFICATION_VECTOR est un typedef

typedef std::vector<STRUCT_MUX_NOTIFICATION> MUX_NOTIFICATION_VECTOR; 

Le iterator pour un conteneur peut souvent être confondu avec un pointeur (parce que cela fonctionne de la même façon) et, dans le cas de certaines implémentations stl, il peut effectivement être un pointeur (c'était probablement le cas avec STL fourni avec VC6). Mais il n'y a aucune garantie à ce sujet.

Ce que vous devez faire est la suivante:

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

Oui c'est un Typedef ... et votre déclaration est parfaite. Votre raisonnement semble être correct. +1 Marquer comme la bonne réponse sauf si quelqu'un a une explication plus détaillée. Merci Benoit. – bobbyalex

1

Vous aurez besoin de déréférencer le iterator pour obtenir le struct approprié (ne sais pas pourquoi il a travaillé auparavant?):

STRUCT_MUX_NOTIFICATION *pstMuxNotfn = *MuxNotfnIterator; 
+0

Si mon hypothèse est correcte, ce que vous proposez ne fonctionnera pas. –

4

Je pense que cela devrait faire l'astuce:

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

+1 comme ceci fonctionne. Mais j'ai encore besoin d'une réponse sur pourquoi cela a fonctionné avant et pourquoi pas maintenant. Les détails en fait. J'ai aussi lu qu'il y a des changements de rupture dans STL par rapport aux itérateurs à partir de VC7. – bobbyalex

+0

Il y a des changements de "rupture" si votre code était incorrect avant - comme supposer que les itérateurs vectoriels sont des pointeurs. VC6 ne correspondait pas exactement au standard C++ 98 (ne serait-ce que parce qu'il est vieux de quelques mois). VC7 adhère plus étroitement à la norme, et ajoute en outre des options de débogage supplémentaires. Des itérateurs plus intelligents aident. Ceux-ci répondent toujours aux exigences standard, mais sont plus robustes aux abus. – MSalters

Questions connexes