2013-09-23 13 views
5

Mam następujący bardzo dziwną sytuację ... mój kompilator Visual Studio 2010 nie podoba się następujący fragment kodu:Visual Studio 2010 C++ kompilator problem

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

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

daje mi:

..\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' 

i zrzut ekranu:

VS2010 error

ALE czy zmienić nazwę zmiennej do lst zamiast lst2 wszystko kompiluje ...

Czy to zabawny bug w Visual Studio 2010 (ponieważ GCC nie dba o niego), albo jest bardziej ukryty powód?

+0

Sprawdź, czy lst2 nie jest jeszcze zdefiniowany/zadeklarowany/makro w zakresie. – user2672165

+1

lst2 jest makro. Na zrzucie ekranu wygląda na to, że ma inny kolor, który powinien go zdradzić. – relaxxx

+1

Wskazówka: Naprawiono definiując 'WIN32_LEAN_AND_MEAN'. – MSalters

Odpowiedz

12

Tego rodzaju błędy są zwykle wynikiem nieoczekiwanego makra o tej samej nazwie. Trochę google znajdą Państwo ten wiersz w nagłówku Windows SDK Dlgs.h:

#define lst2  0x0461 

To, co nazywam nazwa zanieczyszczenie!

Domyślam się, że MS ludzie myśleli, że używając innego identyfikatora sterami każdy dialog, co trudne do utrzymania, a więc choć dając wykazy dowolnym dialogowe same identyfikatory: lst1, lst2, lst3. .. lst16. I to samo z każdym innym rodzajem kontroli. Ale z jakiegoś powodu pomysł nie został złapany, a nagłówek Dlgs.h został zapomniany.

Dziwne jest to, że ten nagłówek jest domyślnie dołączony do projektu VC++, a nie do kompilacji GCC. Może środowisko to nie to samo.

+0

Uderzyłeś mnie w to; mieć +1. * Najlepszy przykład * tego, co jest nie tak z makrami. – Angew

+2

@Angew: Wszyscy wiedzą, że makra są złe. Ale jeśli to miejsce o nazwie 'WIN32_DLG_DEFAULT_LIST_2' nikt by się tym nie przejmował. Używanie 'lst2' jako nazwy makra jest złe i głupie. – rodrigo

+0

Predrocessor definiuje w '' są w użyciu. Są to stałe symboliczne dla identyfikatorów kontrolnych używanych we wspólnych oknach dialogowych (takich jak okno dialogowe otwierania pliku). Jeśli chcesz dostosować wspólne okno dialogowe, będziesz potrzebować tych identyfikatorów (zobacz [Procedury haka w stylu eksploratora] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms646960.aspx#_win32_Explorer_Style_Hook_Procedures)) . Co więcej, przypisanie innego identyfikatora każdej kontrolce w każdym oknie dialogowym jest w rzeczywistości niemożliwe. Identyfikatory kontrolne są ograniczone do 16 bitów. – IInspectable

0

Wygląda na to, że masz już zmienną o nazwie lst, która ma typ int. Tak, zgadzam się, że wygląda na błąd kompilatora, ponieważ jesteś w nowej przestrzeni zmiennej z if (secondStep) {} opakowane.

Powiązane problemy