运营商LT;重载std :: set

时间:2016-06-07 10:59:58

标签: c++ stl

这是我的代码:

#include <iostream>
#include <set>
#include <string>

class widget
{
public:
    widget(unsigned id) :
        m_id(id)
    {
    };

    ~widget(){};

    unsigned id(){ return m_id; };
    bool active(){ return m_active; };
    void set_active(bool active){ m_active = active; };

    friend bool operator<(const widget& lhs, const widget& rhs);

    bool operator<(const widget& rhs)
    {
        return m_id < rhs.m_id;
    }

private:
    unsigned m_id;
    bool m_active{false};
};

bool operator<(const widget& lhs, const widget& rhs)
{
    return lhs.m_id < rhs.m_id;
}

int main()
{  
    std::set<widget> widgets;

    widget foo(5);
    widget bar(2);

    widgets.insert(foo);
    widgets.insert(bar);

    for(const auto& hi : widgets)
        std::cout << hi.id() << std::endl;
}

编译时我收到错误: passing 'const widget' as 'this' argument of 'unsigned int widget::id()' discards qualifiers [-fpermissive]

而且我不明白发生了什么。我在做错误的操作符重载吗?另外,我是否需要运营商&lt;作为具有一个参数的成员函数和具有两个参数的自由函数?

1 个答案:

答案 0 :(得分:3)

为您的函数const添加id限定符:

 unsigned id() const { return m_id; }

原因是在循环中,使用widgets引用迭代const集合 - 禁止在此调用非const成员函数。