这是我的代码:
#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;作为具有一个参数的成员函数和具有两个参数的自由函数?
答案 0 :(得分:3)
为您的函数const
添加id
限定符:
unsigned id() const { return m_id; }
原因是在循环中,使用widgets
引用迭代const
集合 - 禁止在此调用非const成员函数。