c – std :: set.insert将无法使用自定义类进行编译

参见英文答案 > problems with c++ set container                                    2个
>            Cant insert to std::map (G++)                                    1个
我有一个类,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
In file included from c:\mingw\bin../lib/gcc/mingw32/4.6.2/include/c++/string:5
0:0,
from 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,
from c:\mingw\bin../lib/gcc/mingw32/4.6.2/include/c++/ios:43,
from c:\mingw\bin../lib/gcc/mingw32/4.6.2/include/c++/ostream:
40,
from c:\mingw\bin../lib/gcc/mingw32/4.6.2/include/c++/iostream
:40,
from a9.cpp:3:
c:\mingw\bin../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_function.h:
In member
function ‘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:
inst
antiated from ‘std::pair, bool> std::_Rb_tree<_Key,
_Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique(const _Val&) [with _Key
= Record, _Val = Record, _KeyOfValue = std::_Identity, _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: instantiated from here
c:\mingw\bin../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_function.h:236:22:
er
ror: no match for ‘operator<‘ in ‘__x < __y’
c:\mingw\bin../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_function.h:236:22:
no
te: candidates are:
c:\mingw\bin../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_pair.h:207:5:
note: 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:
not
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:
note
: template 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:
note:
template 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:
note: t
emplate
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:
note: 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:
not
e: template bool std::operator<(const
std::multiset<_Key, _Compare, _Alloc>&, const std::multiset<_Key, _Compare, _All
oc>&)

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

提前致谢.

解决方法:

你需要重载运算符< :
类似以下内容:

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

原因是STL集维护元素的顺序. std :: set支持指定比较函数.默认值小于将使用运算符<检查平等. 同时,你必须结束你的课程定义;否则,编译错误.

class Record
{
   int a, b, c;
   public:
   //getters and setters
   Record(){a = -1; b = -1; c = -1;};
}; //<---Cannot miss this ;
上一篇:未定义的引用 – C链接器错误


下一篇:Vim无法在OS X上使用python进行编译