3

I have a following trouble:

struct ServerPP { std::string name; int id; int expires; }; std::map<std::string, std::set<ServerPP>> RemindTable; int test(std::string email, ServerPP serv) { RemindTable[email].insert(serv); // error when compile in this row below } 

Error in g++:

In file included from /usr/include/c++/4.4/string:50, from /usr/include/c++/4.4/bits/locale_classes.h:42, from /usr/include/c++/4.4/bits/ios_base.h:43, from /usr/include/c++/4.4/ios:43, from /usr/include/c++/4.4/istream:40, from /usr/include/c++/4.4/sstream:39, from stdafx.h:19, from ActiveReminder.cpp:4: /usr/include/c++/4.4/bits/stl_function.h: In member function 'bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = ServerPP]': /usr/include/c++/4.4/bits/stl_tree.h:1170: instantiated from 'std::pair<typename std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator, bool> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique(const _Val&) [with _Key = ServerPP, _Val = ServerPP, _KeyOfValue = std::_Identity<ServerPP>, _Compare = std::less<ServerPP>, _Alloc = std::allocator<ServerPP>]' /usr/include/c++/4.4/bits/stl_set.h:411: instantiated from 'std::pair<typename std::_Rb_tree<_Key, _Key, std::_Identity<_Key>, _Compare, typename _Alloc::rebind<_Key>::other>::const_iterator, bool> std::set<_Key, _Compare, _Alloc>::insert(const _Key&) [with _Key = ServerPP, _Compare = std::less<ServerPP>, _Alloc = std::allocator<ServerPP>]' ActiveReminder.cpp:32: instantiated from here /usr/include/c++/4.4/bits/stl_function.h:230: error: no match for 'operator<' in '__x < __y' 

How can i fix this error in G++, on windows all ok

Thanks!

2
  • reinstall GNU Compiler Collection!!!!!!!!!!!!1 Commented Apr 7, 2013 at 22:49
  • 2
    Are you sure that all is okay on Windows? Try compiling code that actually calls the test() function and I think you will find an error emitted by VC++ as well. @AndyProwl's answer is spot-on. Commented Apr 7, 2013 at 22:54

1 Answer 1

11

You have to define operator < for your ServerPP data structure if you want to be able to use it in std::set. For instance:

bool operator < (ServerPP const& lhs, ServerPP const& rhs) { return (lhs.id < rhs.id); } 

Alternatively, you can define your own comparator and provide its type as the second template argument to std::set:

struct serv_comp { bool operator () (ServerPP const& lhs, ServerPP const& rhs) { return (lhs.id < rhs.id); } }; std::map<std::string, std::set<ServerPP, serv_comp>> RemindTable; 

Here is a live example showing the code compiling.

Sign up to request clarification or add additional context in comments.

1 Comment

Could you re-upload your live example in another site? The current does not show anything.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.