2013-09-23 71 views
5

我有以下的非常奇怪的情況......我的Visual Studio 2010的編譯器不喜歡下面的一段代碼:Visual Studio 2010的C++編譯器的問題

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

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

它給了我:

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

和截圖:

VS2010 error

,如果我重新命名變量lst而不是lst2一切編譯...

這是在Visual Studio 2010(因爲GCC不關心它),或者還有一個更隱祕的理由一個有趣的錯誤嗎?

+0

檢查範圍中的lst2是否已經定義/聲明/宏。 – user2672165

+1

lst2是一個宏。從截圖看,它看起來有不同的顏色,應該放棄它 – relaxxx

+1

提示:通過定義'WIN32_LEAN_AND_MEAN'修復。 – MSalters

回答

12

這些類型的錯誤通常是與您的變量名稱相同的意外宏的結果。谷歌的一點會發現你這條線在Windows SDK頭Dlgs.h

#define lst2  0x0461 

這就是我所說的名污染

我的猜測是,MS人們想到用不同的ID對每個對話框控件保持什麼樣硬,所以他們雖然給人的任何列表對話框相同的ID:lst1lst2lst3。 .. lst16。和其他類型的控制一樣。但由於某種原因,這個想法沒有得到解決,並且Dlgs.h標題被遺忘了。

現在,奇怪的是,這個頭默認包含在你的VC++項目中,而不是你的GCC編譯中。也許環境不一樣。

+0

你打敗了我;有+1。 *宏的例子*有什麼問題。 – Angew

+2

@Angew:大家都知道宏是邪惡的。但是如果它名爲'WIN32_DLG_DEFAULT_LIST_2'的地方沒有人會關心。使用'lst2'作爲宏名是邪惡和愚蠢的。 – rodrigo

+0

在''中定義的預處理器正在使用中。它們是常用對話框中使用的控件ID的象徵常量(如「打開文件對話框」)。如果你想定製一個通用對話框,你需要這些ID(參見[資源管理器樣式鉤子程序](http://msdn.microsoft.com/en-us/library/windows/desktop/ms646960.aspx#_win32_Explorer_Style_Hook_Procedures)) 。另外,在每個對話框中爲每個控件分配一個不同的ID實際上是不可能的。控制ID被限制在16位。 – IInspectable

0

看起來你已經有一個名爲lst的變量,它有一個int類型。 是的,我同意它看起來像編譯器的錯誤,因爲你在一個新的變量空間與if(secondStep){}包裝。

相關問題