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

use*_*849 3 c++ compilation class insert 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());
}
Run Code Online (Sandbox Code Playgroud)

尝试编译导致此错误的结果:

C:\ Users\Denton\Documents\Indiana University\Class Documents\Spring 2013\CSCI-H2 12\Assignment9> 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,from 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/include/c ++/bits/stl_function. h:在成员函数'bool std :: less <_Tp> :: operator()(const _Tp&,const _Tp&)const [with _ Tp = Record]':c:\ mingw\bin ../ lib/gcc/mingw32 /4.6.2/include/c++/bits/stl_tree.h:1267:4:从'std :: pair,bool> std :: _ Rb_tree <_Key,_Val,_KeyOfValue,_Compare,_Alloc> :: _ M_insert_unique(const _Val&)[with _Key = Record,_Val = Record,_KeyOfValue = std :: _ Ident ity,_Compare = std :: l ess,_Alloc = std :: allocator]'c:\ mingw\bin ../ lib/gcc/mingw32/4.6.2/include/c ++/bits/stl_set.h:410:29 :insta ntiated from'std :: pair,_Compare,typename _Alloc :: rebind <_Key> :: other> :: const_iterator,bool> std :: set <_Key,_Compare,_Alloc> :: insert(const value_type&)[with _Key = Record,_Compar e = std :: less,_ Alloc = std :: allocator,typename std :: _ Rb_tree <_ Key,_Key,std :: _ Identity <_Key>,_ Compare,typename _Alloc :: rebind <_Key> :: other> :: const_iterator = std :: _ Rb_tree_const_iterator,std :: set <_Key,_Compare,_Alloc> :: value_type = Record]'a9.cpp:72:28:从这里实例化c:\ mingw\bin ../ lib /gcc/mingw32/4.6.2/include/c++/bits/stl_function.h:236:22:er ror:'__x <__y'中的'operator <'不匹配c:\ mingw\bin ../ lib/gcc/mingw32/4.6.2/include/c ++/bits/stl_function.h:236:22:没有te:候选者是:c:\ mingw\bin ../ lib/gcc/mingw32/4.6.2/include/c ++ /bits/stl_pair.h:207:5:注意:t emplate bool std :: operator <(const std :: pair <_T1,_T2>&,co nst std :: pair <_T1,_T2>&)c:\ mingw\bin ../ lib/gcc/mingw32/4.6.2/include/c ++/bits/stl_iterator.h:291:5:不是e:template bool std :: operator <(const std :: reverse_iterator <_It erator> &,const std :: reverse_iterator <_Iterator>&)c:\ mingw\bin ../ lib/gcc/mingw32/4.6.2/include/c ++/bits/stl_iterator.h:341:5:not e:template bool std :: operator <(const std :: r everse_iterator <_IteratorL>&,const std :: reverse_iterator <_IteratorR>&)c:\ mingw\bin ../ lib/gcc/mingw32/4.6.2/include/c ++/bits/basic_string.h:2510:5:没有te:模板bool std :: operator <(cons t std :: basic_string <_CharT,_Traits,_Alloc>&,const std :: basic_string <_CharT,_ Traits,_Alloc>& )c:\ mingw\bin ../ lib/gcc/mingw32/4.6.2/include/c ++/bits/basic_string.h:2522:5:no te:template bool std :: operator <(cons t std :: basic_string <_CharT,_Traits,_Alloc>&,const _CharT*)c:\ mingw\bin ../ lib/gcc/mingw32/4.6.2/include/c ++/bits/basic_string.h:2534:5:no te: template bool std :: operator <(cons t _CharT*,const std :: basic_string <_CharT,_Traits,_Alloc>&)c:\ mingw\bin ../ lib/gcc/mingw32/4.6 .2/include/c ++/bits/stl_vector.h:1290:5:注意:模板bool std :: operator <(const std :: vector <_Tp,_ Alloc>&,const std :: vector <_Tp,_Alloc> &)c:\ mingw\bin ../ lib/gcc/mingw32/4.6.2/include/c ++/bits/stl_list.h:1593:5:注意:模板bool std :: operator <(const std :: list <_Tp,_Allo c>&,const std :: list <_Tp,_Alloc>&)c:\ mingw\bin ../ lib/gcc/mingw32/4.6.2/include/c ++/bits/stl_tree.h:856 :5:注意:t强制bool std :: operator <(const std :: _ Rb_tree <_Key,_Val,_KeyOfValue,_Compare,_ All oc>&,const std :: _ Rb_tree <_Key,_Val,_KeyOfValue,_Compare,_ Alloc>& )c:\ mingw\bin ../ lib/gcc/mingw32/4.6.2/include/c ++/bits/stl_set.h:713:5:注意:te mplate bool std :: operator <(const std :: set <_Key,_Compare,_ Alloc>&,const std :: set <_Key,_Compare,_Alloc>&)c:\ mingw\bin ../ lib/gcc/mingw32/4.6.2/include/c ++/bits/stl_multiset. h:696:5:不是e:template bool std :: operator <(const std :: multiset <_Key,_Compare,_Alloc>&,const std :: multiset <_Key,_Compare,_ All oc> &&)

当我创建一个set和s.insert时插入工作正常(1)这个代码需要做什么才能编译?

提前致谢.

tao*_*ocp 12

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

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

原因是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 ;
Run Code Online (Sandbox Code Playgroud)