现在的位置: 首页 > 综合 > 正文

C++ map以class为key的编译错误和解决办法

2012年12月30日 ⁄ 综合 ⁄ 共 943字 ⁄ 字号 评论关闭
class Concept
{
    public:
        string name;
};

map<Concept, int> conceptCount;
conceptCount[i.c]++;

编译错误:

/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_function.h: In member function ‘bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = Concept]’:
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_map.h:347:   instantiated from ‘_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = Concept, _Tp = int, _Compare = std::less<Concept>, _Alloc = std::allocator<std::pair<const Concept, int> >]’
bayes.cpp:25:   instantiated from here
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_function.h:227: error: no match for ‘operator<’ in ‘__x < __y’
make: *** [bayes.o] Error 1

原因:map中的key默认是以less<>升序对元素排序(排序准则也可以修改),也就是说key必须具备operator<对元素排序,而平常我们的用的基本上都是基本类型元素作为key

解决办法:重写operator <

class Concept
{
    public:
        string name;

        bool operator <(const Concept& c) const
        {
            if(name < c.name)
            {
                return true;
            }
            return false;
        }
};

抱歉!评论已关闭.