2010-09-13 7 views
0

Je porte un projet C++ sur VS2008. morceau de code a une variable déclarée dans l'instruction de boucle comme ci-dessous:Erreur VC++ C2065 dans la version de débogage

pour (! BmpMapType :: const_iterator it = bitmaps.begin(), elle = bitmaps.end(); ++ il) {

}

"il" est plus tard utilisé comme un index dans un autre pour instruction de boucle comme ci-dessous: pour (= il bitmaps.begin(), elle = bitmaps.end(); ++ it!) {

}

Il génère l'erreur c2065 dans la version de débogage avec les paramètres de projet ci-dessous où la génération de version a réussi.

J'ai défini le champ C \ C++> Pour la conformité dans For Scope Scope sur No (/ Zc: forscope-) et construit le projet avec le mode de configuration de release. Le code a été construit avec succès.

Le même code avec les mêmes paramètres ne parvient pas à générer en mode débogage. Quelqu'un peut-il m'aider à résoudre le problème?

Toute aide est appréciée.

Merci, Lakshmi

Répondre

1

La variable it est déclarée à l'intérieur de la liste d'initialisation de la boucle for, ce qui signifie que son champ d'application se termine en même temps que le champ d'application de la boucle for. La définition de l'option /Zc:forscope- active l'extension spécifique à MS qui conserve la déclaration it active jusqu'à la fin de la portée englobante dans laquelle votre boucle for est définie (par exemple, quel que soit le corps de la fonction dans laquelle votre extrait de code existe). À mon humble avis, vous ne devriez pas utiliser l'indicateur /Zc:forscope- car il compile le code non standard sans erreurs. Pour résoudre votre problème, vous pouvez faire une des deux choses:

bmpMapType::const_iterator it; 
//first loop 
for(it = bitmaps.begin(); it != bitmaps.end(); ++it) { ... } 
... 
//second loop 
for(it = bitmaps.begin(); it != bitmaps.end(); ++it) { ... } 

OU

//first loop 
for(bmpMapType::const_iterator it = bitmaps.begin(); it != bitmaps.end(); ++it) { ... } 
... 
//second loop 
for(bmpMapType::const_iterator it = bitmaps.begin(); it != bitmaps.end(); ++it) { ... } 
+0

Merci. Cela fonctionne bien. Je ai une question pourquoi cela fonctionne en mode de libération sans le déclarer à nouveau comme mentionné – Lakshmi

+0

Assurez-vous que le drapeau '/ Zc: forscope' a le même paramètre dans les deux modes Debug et Release, autant que je sais qu'il devrait soit construire ou échouer les deux construisent des configurations si ce drapeau est défini de manière cohérente. – Praetorian

0

Une solution simple peut être juste de modifier la deuxième boucle pour correspondre à la première - en déclarant sa propre copie it selon

for(bmpMapType::const_iterator it = bitmaps.begin(); it != bitmaps.end(); ++it) { 

} 

moins qu'il y ait lieu entre les boucles où l'on utilise la première it. Si l'utilisation de chacun est entièrement locale à leurs boucles respectives, alors faites-le et continuez avec votre port.