2009-06-10 20 views
0

Ich bekomme den folgenden Fehler beim Migrieren von VC6-Code zu VS2008. Dieser Code funktioniert gut in VC6, aber gibt einen Kompilierungsfehler in VC9. Ich weiß, dass es wegen eines Compilers ist, der die Änderung bricht. Was ist das Problem und wie behebe ich es?Fehler C2440: "Initialisierung": kann nicht konvertieren von "Std :: _ Vector_iterator <_Ty,_Alloc>" auf "Typ *"

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 
} 

Antwort

8

Wenn es w orked vor, ich bin zu raten MUX_NOTIFICATION_VECTOR ist ein typedef

typedef std::vector<STRUCT_MUX_NOTIFICATION> MUX_NOTIFICATION_VECTOR; 

Der Iterator für einen Behälter oft verwechselt mit einem Zeiger sein kann (weil es die gleiche Art und Weise funktioniert) und im Falle einiger stl Implementierungen, kann es tatsächlich Seien Sie ein Zeiger (es war wahrscheinlich der Fall mit STL mit VC6 zur Verfügung gestellt). Aber dafür gibt es keine Garantie.

Was sollten Sie tun, ist die folgende:

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

Ja, es ist ein Typedef ... und Ihre Erklärung ist perfekt. Ihre Argumentation scheint zu stimmen. +1. Kennzeichnung als die richtige Antwort, es sei denn jemand hat eine ausführlichere Erklärung. Danke Benoit. – bobbyalex

1

Sie werden müssen dereferenzieren der Iterator die entsprechende Struktur zu erhalten (nicht sicher, warum es vorher gearbeitet?):

STRUCT_MUX_NOTIFICATION *pstMuxNotfn = *MuxNotfnIterator; 
+0

Wenn meine Hypothese richtig ist, was Sie vorschlagen, wird nicht funktionieren. –

4

Ich denke, das tun sollten der Trick:

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

+1 wie das funktioniert. Aber ich brauche immer noch eine Antwort darauf, warum es vorher funktioniert hat und warum nicht jetzt. Die Besonderheiten tatsächlich. Ich lese auch, dass es ab der VC7 bricht Änderungen in STL in Bezug auf Iteratoren gibt. – bobbyalex

+0

Es gibt "brechende" Änderungen, wenn Ihr Code vorher falsch war - wie angenommen, dass Vektoriteratoren Zeiger sind. VC6 stimmte nicht genau mit dem C++ 98 Standard überein (nur weil es ein paar Monate älter ist). VC7 hält sich enger an den Standard und bietet darüber hinaus zusätzliche Debugging-Optionen. Intelligentere Iteratoren helfen. Diese erfüllen immer noch die Standardanforderungen, sind aber robuster gegen Missbrauch. – MSalters

Verwandte Themen