首页 文章

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

提问于
浏览
2

这个问题在这里已有答案:

我有一个类,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> 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 / 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 :: _ Ide ntity,_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:no te:template 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> &&)

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

提前致谢 .

1 回答

  • 8

    你需要重载 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 ;
    

相关问题