std :: set.insert不会使用自定义类进行编译

时间:2013-04-09 22:43:51

标签: c++ class insert compilation set

我有一个类Record,有三个私有整数字段,getter和setter,以及一个默认的特定构造函数。我打算使用Records填充一个集合,但是在使代码生效时遇到了问题。

#include <set>
using namespace std;

class Record
{
    int a, b, c;
    public:
    //getters and setters
    Record(){a = -1; b = -1; c = -1;};
}

int main()
{
    set< Record > s;
    s.insert(Record());
}

尝试编译此错误的结果:

  

C:\ Users \ Denton \ Documents \ Indiana University \ Class Documents \ Spring   2013 \ CSCI-H2       12 \ Assignment9&gt; g ++ a9.cpp -o a9       在c:\ mingw \ bin ../ lib / gcc / mingw32 / 4.6.2 / include / c ++ / string:5中包含的文件中       0:0,                        来自c:\ mingw \ bin ../ lib / gcc / mingw32 / 4.6.2 / include / c ++ / bits / loc       ale_classes.h:42,                        来自c:\ mingw \ bin ../ lib / gcc / mingw32 / 4.6.2 / include / c ++ / bits / ios       _base.h:43,                        来自c:\ mingw \ bin ../ lib / gcc / mingw32 / 4.6.2 / include / c ++ / ios:43,                        来自c:\ mingw \ bin ../ lib / gcc / mingw32 / 4.6.2 / include / c ++ / ostream:       40,                        来自c:\ mingw \ bin ../ lib / gcc / mingw32 / 4.6.2 / include / c ++ / iostream       :40,                        来自a9.cpp:3:       C:\ MinGW的\ BIN ../ LIB / GCC /的mingw32 / 4.6.2 /包括/ C ++ /比特/ stl_function.h:   在会员        function&#39; bool std :: less&lt; _Tp&gt; :: operator()(const _Tp&amp;,const _Tp&amp;)const [with _       Tp =记录]&#39;:       C:\ MinGW的\ BIN ../ LIB / GCC /的mingw32 / 4.6.2 /包括/ C ++ /比特/ stl_tree.h:1267:4:   研究所       来自&#39; std :: pair,bool&gt;的std :: _ Rb_tree&LT; _key,        _Val,_KeyOfValue,_Compare,_ Alloc&gt; :: _ M_insert_unique(const _Val&amp;)[with _Key       = Record,_Val = Record,_KeyOfValue = std :: _ Identity,_Compare = std :: l       ess,_Alloc = std :: allocator]&#39;       C:\ MinGW的\ BIN ../ LIB / GCC /的mingw32 / 4.6.2 /包括/ C ++ /比特/ stl_set.h:410:29:   斯塔       来自&#39; std :: pair,        _Compare,typename _Alloc :: rebind&lt; _Key&gt; :: other&gt; :: const_iterator,bool&gt;的std ::设为       &lt; _Key,_Compare,_ Alloc&gt; :: insert(const value_type&amp;)[with _Key = Record,_Compar       e = std :: less,_Alloc = std :: allocator,typename std :: _ Rb_tree&lt; _       Key,_ Key,std :: _ Identity&lt; _Key&gt;,_ Compare,typename _Alloc :: rebind&lt; _Key&gt; :: other&gt;       :: const_iterator = std :: _ Rb_tree_const_iterator,std :: set&lt; _Key,_Compare       ,_Alloc&gt; :: value_type =记录]&#39;       a9.cpp:72:28:从这里实例化       C:\ MinGW的\ BIN ../ LIB / GCC /的mingw32 / 4.6.2 /包括/ C ++ /比特/ stl_function.h:236:22:   呃       ror:不匹配&#39;运营商&lt;&#39; in&#39; __ x&lt; __y&#39;       C:\ MinGW的\ BIN ../ LIB / GCC /的mingw32 / 4.6.2 /包括/ C ++ /比特/ stl_function.h:236:22:   没有       te:候选人是:       C:\ MinGW的\ BIN ../ LIB / GCC /的mingw32 / 4.6.2 /包括/ C ++ /比特/ stl_pair.h:207:5:   注意:t       emplate bool std :: operator&lt;(const std :: pair&lt; _T1,_T2&gt;&amp;,co       nst std :: pair&lt; _T1,_T2&gt;&amp;)       C:\ MinGW的\ BIN ../ LIB / GCC /的mingw32 / 4.6.2 /包括/ C ++ /比特/ stl_iterator.h:291:5:   不       e:模板bool std :: operator&lt;(const std :: reverse_iterator&lt; _It       erator&gt;&amp;,const std :: reverse_iterator&lt; _Iterator&gt;&amp;)       C:\ MinGW的\ BIN ../ LIB / GCC /的mingw32 / 4.6.2 /包括/ C ++ /比特/ stl_iterator.h:341:5:   不       e:template bool std :: operator&lt;(const std :: r       everse_iterator&lt; _IteratorL&gt;&amp;,const std :: reverse_iterator&lt; _IteratorR&gt;&amp;)       C:\ MinGW的\ BIN ../ LIB / GCC /的mingw32 / 4.6.2 /包括/ C ++ /比特/ basic_string.h:2510:5:   没有       te:template bool std :: operator&lt;(cons       t std :: basic_string&lt; _CharT,_Traits,_Alloc&gt;&amp;,const std :: basic_string&lt; _CharT,_       特征,_Alloc&gt;&amp;)       C:\ MinGW的\ BIN ../ LIB / GCC /的mingw32 / 4.6.2 /包括/ C ++ /比特/ basic_string.h:2522:5:   没有       te:template bool std :: operator&lt;(cons       t std :: basic_string&lt; _CharT,_Traits,_Alloc&gt;&amp;,const _CharT *)       C:\ MinGW的\ BIN ../ LIB / GCC /的mingw32 / 4.6.2 /包括/ C ++ /比特/ basic_string.h:2534:5:   没有       te:template bool std :: operator&lt;(cons       t _CharT *,const std :: basic_string&lt; _CharT,_Traits,_Alloc&gt;&amp;)       C:\ MinGW的\ BIN ../ LIB / GCC /的mingw32 / 4.6.2 /包括/ C ++ /比特/ stl_vector.h:1290:5:   注意       :template bool std :: operator&lt;(const std :: vector&lt; _Tp,_       Alloc&gt;&amp;,const std :: vector&lt; _Tp,_Alloc&gt;&amp;)       C:\ MinGW的\ BIN ../ LIB / GCC /的mingw32 / 4.6.2 /包括/ C ++ /比特/ stl_list.h:1593:5:   注意:       template bool std :: operator&lt;(const std :: list&lt; _Tp,_Allo       c&gt;&amp;,const std :: list&lt; _Tp,_Alloc&gt;&amp;)       C:\ MinGW的\ BIN ../ LIB / GCC /的mingw32 / 4.6.2 /包括/ C ++ /比特/ stl_tree.h:856:5:   注意:t       emplate        bool std :: operator&lt;(const std :: _ Rb_tree&lt; _Key,_Val,_KeyOfValue,_Compare,_ All       oc&gt;&amp;,const std :: _ Rb_tree&lt; _Key,_Val,_KeyOfValue,_Compare,_Alloc&gt;&amp;)       C:\ MinGW的\ BIN ../ LIB / GCC /的mingw32 / 4.6.2 /包括/ C ++ /比特/ stl_set.h:713:5:   注意:te       mplate bool std :: operator&lt;(const std ::       set&lt; _Key,_Compare,_ Alloc&gt;&amp;,const std :: set&lt; _Key,_Compare,_Alloc&gt;&amp;)       C:\ MinGW的\ BIN ../ LIB / GCC /的mingw32 / 4.6.2 /包括/ C ++ /比特/ stl_multiset.h:696:5:   不       e:模板bool std :: operator&lt;(const       std :: multiset&lt; _Key,_Compare,_Alloc&gt;&amp;,const std :: multiset&lt; _Key,_Compare,_ All       OC&GT;&安培;)

当我创建一个s和s.insert时,

插入工作正常(1) 要编译此代码需要做什么?

提前致谢。

1 个答案:

答案 0 :(得分:11)

您需要重载operator<: 如下所示:

bool operator<(const Record& rhs) const 
{
   return a < rhs.a;  //assume that you compare the record based on a
}

原因是STL集维护元素的顺序。 std :: set支持指定比较函数。默认值为less,它将使用operator <来检查相等性。

同时,你必须用;结束你的类定义,否则编译错误。

class Record
{
   int a, b, c;
   public:
   //getters and setters
   Record(){a = -1; b = -1; c = -1;};
}; //<---Cannot miss this ;