2010-09-13 24 views
0

我將一個C++項目移植到VS2008。 件的代碼具有在用於如下面循環語句中聲明的變量:調試版本中的VC++錯誤C2065

爲(!bmpMapType ::爲const_iterator它= bitmaps.begin();它= bitmaps.end(); ++它) {

}

「它」 稍後用作索引在另一個for循環語句,如下: 爲(它= bitmaps.begin();它= bitmaps.end(); ++它!) {

}

它在調試版本中生成錯誤c2065,在發佈版本成功時,下面的項目設置。

我已將C \ C++> Language> For For循環範圍設置爲No(/ Zc:forscope-),​​並使用發佈配置模式構建項目。代碼已成功構建。

具有相同設置的相同代碼無法在調試模式下生成。 任何人都可以幫助我解決問題。

任何幫助表示讚賞。

謝謝, 拉克希米

回答

1

it變量在for環路初始化列表,這意味着它的範圍與for循環範圍結束沿內聲明。設置/Zc:forscope-選項將啓用MS特定的擴展,該擴展使it聲明保持活動狀態,直到定義了for循環的封閉範圍的末尾(例如,無論您的代碼段的函數體是否存在)。恕我直言,你不應該使用/Zc:forscope-標誌,因爲它編譯非標準的代碼沒有錯誤。要解決你的問題,你可以做兩件事情之一:

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

OR

//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

謝謝。這工作正常。我有一個問題,爲什麼它在釋放模式下工作,沒有像上面提到的那樣聲明它 – Lakshmi 2010-09-13 20:31:27

+0

確保'/ Zc:forscope'標誌在Debug和Release模式下具有相同的設置,據我所知它應該建立或失敗如果該標誌一致地設置,則都會構建配置。 – Praetorian 2010-09-13 20:36:19

0

一個簡單的修復可能只是修改第二循環相匹配的第一 - 宣佈自己的副本it按照

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

} 

除非有在使用所述第一it環之間的某個地方。如果每個環路的使用完全位於各自的環路中,那麼只需執行此操作並繼續使用端口即可。