2013-04-07 108 views
3

我有以下烦恼:广东话插入到std ::地图(G ++)

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 
} 

错误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' 

如何解决在G ++这个错误,就一切ok窗口

谢谢!

+0

重新安装GNU编译器集合!!!!!!!!!!!! 1 – 2013-04-07 22:49:49

+2

你确定在Windows上一切正常吗?尝试编译实际调用'test()'函数的代码,我想你也会发现VC++发出的错误。 @ AndyProwl的答案是现货。 – 2013-04-07 22:54:00

回答

10

如果您想要在std::set中使用它,则必须为您的ServerPP数据结构定义operator <。例如:

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

或者,您也可以定义自己的比较,并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; 

下面是该代码编译一个live example

+0

你能否在其他网站上重新上传你的实例?目前没有显示任何东西。 – gon1332 2015-09-10 12:33:43

+0

@ gon1332:完成,谢谢。 – 2015-09-10 12:36:59