C++ STL map中的Key使用自定義類型

C++ STL 中的map容器中的元素是按照Key的升序進行排列的,所以map的Key需要使用自定義類型時,該自定義類型必須重載operator<操作符,否則會出現下面的編譯錯誤:

 

  1. In file included from /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/string:50,
  2.                  from /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/locale_classes.h:42,
  3.                  from /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/ios_base.h:43,
  4.                  from /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/ios:43,
  5.                  from /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/ostream:40,
  6.                  from /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/iostream:40,
  7.                  from dagexing/src/online/dgxdbrpc/dgx_db.cc:2:
  8. /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_function.h: In member function 'bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = dgx_db::KtvRoomInfo]':
  9. /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_map.h:449: instantiated from '_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = dgx_db::KtvRoomInfo, _Tp = dgx_db::Uint32DataType, _Compare = std::less<dgx_db::KtvRoomInfo>, _Alloc = std::allocator<std::pair<const dgx_db::KtvRoomInfo, dgx_db::Uint32DataType> >]'
  10. ./dagexing/src/online/dgxdbrpc/dbcache.h:53: instantiated from 'int dgx_db::DbCache<KeyType, ValueType>::update(const KeyType&, ValueType&) [with KeyType = dgx_db::KtvRoomInfo, ValueType = dgx_db::Uint32DataType]'
  11. dagexing/src/online/dgxdbrpc/dgx_db.cc:136: instantiated from here
  12. /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_function.h:230: error: no match for 'operator<' in '__x < __y'
這個錯誤表示_Key = dgx_db::KtvRoomInfo沒有重載operator<操作符。加入下列重載函數後通過編譯

 

  1. bool operator < (const KtvRoomInfo& info) const {
  2.     if (kiid_ < info.kiid_)
  3.       return true;
  4.     else if (kiid_ == info.kiid_ && enname_ < info.enname_)
  5.       return true;
  6.     else
  7.       return false;
  8.   }

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章