6

I have a class, Record, with three private integer fields, getters and setters, and a default and specific constructor. I intend to populate a set with Records, but am having issues getting the code to work.

#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());
}

Attempting to compile results in this error:

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>&)

insert works fine when I make a set s and s.insert(1) What needs to be done for this code to compile?

Thanks in advance.

Rapptz
  • 20,807
  • 5
  • 72
  • 86
user2263849
  • 71
  • 1
  • 1
  • 3

1 Answers1

22

You need to overload the operator< : something like the following:

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

The reason is that STL set maintains order on elements. std::set supports specifying a comparison function. The default is less which will use operator < to check equality.

Meanwhile, you have to end you class definition with ; otherwise, compile error.

class Record
{
   int a, b, c;
   public:
   //getters and setters
   Record(){a = -1; b = -1; c = -1;};
}; //<---Cannot miss this ;
taocp
  • 23,276
  • 10
  • 49
  • 62
  • I have the semicolon ending my class definition on my actual code, sorry I left it out in this shortened version here. New compile error: `x.cpp: In member function 'bool Record::operator<(const Record&) const':` `x.cpp:30:38: error: passing 'const Record' as 'this' argument of 'int Record::g etOrderNum()' discards qualifiers [-fpermissive]` – user2263849 Apr 09 '13 at 23:03
  • @user2263849 where is your code for: Record::getOrderNum()? – taocp Apr 09 '13 at 23:05
  • @user2263849 you can see that code compiles OK here: http://liveworkspace.org/code/Ya3J3$0 – taocp Apr 09 '13 at 23:06
  • `int getOrderNum(){return ordernum;};` – user2263849 Apr 09 '13 at 23:07
  • For the record regarding the follow-up comment: `int getOrdnerNum() const { return odernum; };` The function has to be const. Since it seems to be used by the operator< function, which is const too. – sbecker Feb 22 '19 at 10:55