首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC6 STL map::end() 比較順序導致編譯錯誤的問題

     編輯:VC 教學

錯誤現象

VC6 編譯下列代碼報錯 error C2679: binary '==' ...:

std::map<int, int> mmm;
std::map<int, int>::const_iterator itr = mmm.find(1234);
if (mmm.end() == itr) // 錯誤
// if (itr == mmm.end()) // 正確

G++ 可正常編譯。

原因分析

map::end() 回傳 iterator (非 const),而 itr 為 const_iterator。VC6 STL 實作中,iterator::operator==(const_iterator) 未定義,但 const_iterator::operator==(iterator) 存在。因此比較順序決定成敗。

解決方法

  1. 調整比較順序:if (itr == mmm.end()) (推薦,符合慣用語)。
  2. 強制轉型:if (mmm.end() == (MYMAP::const_iterator)itr) 或 if (static_cast<MYMAP::const_iterator>(mmm.end()) == itr)。
  3. 升級編譯器:VS2005 起修正此不一致。

最佳實踐

習慣將 iterator 置於左邊:if (itr != container.end()),可避免此類相容性問題,且語意更清晰 (「迭代器是否到達終點」)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved