2013-09-23 3 views
5

J'ai la situation suivante très étrange ... mon compilateur Visual Studio 2010 n'aime pas le morceau de code suivant:Visual Studio 2010 C++ problème compilateur

QStringList lst2 = instantiatedTableInstances.split(strComma, skipper); 

    for(int i=0; i<lst2.size(); i++) 
    { 
     TableInstance* tabInst= v->getTableInstance(lst2.at(i)); 
     result->addInstantiatedTableInstance(tabInst); 
    } 

il me donne:

..\src\DeserializationFactory.cpp(1196) : error C2143: syntax error : missing ';' before 'constant' 
..\src\DeserializationFactory.cpp(1196) : error C2440: '=' : cannot convert from 'QStringList' to 'int' 
    No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 
..\src\DeserializationFactory.cpp(1198) : error C2228: left of '.size' must have class/struct/union 
    type is 'int' 
..\src\DeserializationFactory.cpp(1200) : error C2228: left of '.at' must have class/struct/union 
    type is 'int' 

et une capture d'écran:

VS2010 error

MAIS si je renomme la variable à lst au lieu de lst2 tout compile ...

Est-ce un bug drôle dans Visual Studio 2010 (parce que GCC ne se soucie pas à ce sujet) ou il y a une raison plus cachée pour cela?

+0

Vérifiez que lst2 n'est pas déjà défini/déclaré/macro dans la portée. – user2672165

+1

lst2 est une macro. De la capture d'écran, il semble qu'il a une couleur différente, qui devrait le donner – relaxxx

+1

Astuce: Correction en définissant 'WIN32_LEAN_AND_MEAN'. – MSalters

Répondre

12

Ces types d'erreurs sont généralement le résultat d'une macro inattendue avec le même nom de votre variable. Un peu de google vous trouverez cette ligne dans l'en-tête de Windows SDK Dlgs.h:

#define lst2  0x0461 

C'est ce qu'on appelle la pollution nom!

Je pense que les gens MS pensaient que d'utiliser un autre ID pour les contrôles de chaque boîte de dialogue que difficile à maintenir, et ils se de donner les listes de tout dialogue les mêmes ID: lst1, lst2, lst3. .. lst16. Et la même chose avec n'importe quel autre type de contrôle. Mais pour une raison quelconque, l'idée n'a pas attrapé et l'en-tête Dlgs.h a été oublié. Maintenant, la chose étrange est que cet en-tête est inclus par défaut dans votre projet VC++ et pas dans votre compilation GCC. Peut-être que l'environnement n'est pas le même.

+0

Tu m'as battu dessus; avoir +1. * Premier exemple * de ce qui ne va pas avec les macros. – Angew

+2

@Angew: Tout le monde sait que les macros sont mauvaises. Mais s'il s'appelait 'WIN32_DLG_DEFAULT_LIST_2', personne ne s'en soucierait. Utiliser 'lst2' comme nom de macro est mal et stupide. – rodrigo

+0

Le préprocesseur défini dans '' est en cours d'utilisation. Ce sont les constantes symboliques des identifiants de contrôle utilisés dans les boîtes de dialogue communes (comme la boîte de dialogue Ouvrir un fichier). Si vous souhaitez personnaliser une boîte de dialogue commune, vous aurez besoin de ces identifiants (voir [Procédures d'accrochage de style Explorer] (http://msdn.microsoft.com/fr-fr/library/windows/desktop/ms646960.aspx#_win32_Explorer_Style_Hook_Procedures)) . De plus, assigner un ID différent à chaque contrôle dans chaque boîte de dialogue n'est en effet pas possible. Les ID de contrôle sont limités à 16 bits. – IInspectable

0

On dirait que vous avez déjà eu une variable appelée lst, qui a un type de int. oui, je suis d'accord, il ressemble à un bug du compilateur, puisque vous êtes dans un nouvel espace variable avec if (secondStep) {} enveloppé.

Questions connexes