C++ 无法转换';这';来自';常数CDrawnLabel';至';CDrawnLabel&';

C++ 无法转换';这';来自';常数CDrawnLabel';至';CDrawnLabel&';,c++,set,C++,Set,我需要一个用户定义的设置,根据我想要的顺序。但是当我想访问集合成员时,我得到了错误该对象的类型限定符与成员函数不兼容(当我将鼠标指针放在错误行上时,我得到了这个错误。标题中提到的错误是生成后的fromm error List) 出现此错误的原因是std::set中的键存储为const T。 所以这个表达式(*itbegin)返回一个常量CDrawnLabel。只能从常量对象调用常量成员函数 您将必须使GetLable保持恒定。此外,由于常量成员函数只能返回常量指针/引用,因此该成员应: cons

我需要一个用户定义的设置,根据我想要的顺序。但是当我想访问集合成员时,我得到了错误该对象的类型限定符与成员函数不兼容(当我将鼠标指针放在错误行上时,我得到了这个错误。标题中提到的错误是生成后的fromm error List)


出现此错误的原因是
std::set
中的键存储为
const T
。 所以这个表达式
(*itbegin)
返回一个
常量CDrawnLabel
。只能从常量对象调用常量成员函数

您将必须使GetLable保持恒定。此外,由于常量成员函数只能返回常量指针/引用,因此该成员应:

const LabelRect* getLabelRect() const { return &m_LabelRect; }
虽然不是必需的,但最好将比较器设置为常量,因为它不会修改任何数据。可以做的另一个改进是,不使用引用,而是将const ref传递给比较器

bool operator<(const CDrawnLabel &rhs) const
{
    //This is the set ordering
    return getLabelRect()->right < rhs.getLabelRect()->right;
}
bool操作符右侧右侧;
}

出现此错误的原因是
std::set
中的键存储为
const T
。 所以这个表达式
(*itbegin)
返回一个
常量CDrawnLabel
。只能从常量对象调用常量成员函数

您将必须使GetLable保持恒定。此外,由于常量成员函数只能返回常量指针/引用,因此该成员应:

const LabelRect* getLabelRect() const { return &m_LabelRect; }
虽然不是必需的,但最好将比较器设置为常量,因为它不会修改任何数据。可以做的另一个改进是,不使用引用,而是将const ref传递给比较器

bool operator<(const CDrawnLabel &rhs) const
{
    //This is the set ordering
    return getLabelRect()->right < rhs.getLabelRect()->right;
}
bool操作符右侧右侧;
}


这里的问题是
std::set::iterator
实际上是一个
const\u迭代器
,因此
(*itbegin)
具有类型
const CDrawnLabel&
。为什么会这样?如果你能改变集合中的引用,你就可以使排序无效。因此,您需要将对象从集合中取出,对其进行修改,然后将其放回集合中。或者,如果您不想更改它,您可以定义一个常量函数
getConstLabelRect()

这里的问题是
std::set::iterator
实际上是一个
const\u迭代器
(*itbegin)
具有类型
constcdrawnlabel&
。为什么会这样?如果你能改变集合中的引用,你就可以使排序无效。因此,您需要将对象从集合中取出,对其进行修改,然后将其放回集合中。或者,如果您不想更改它,可以定义一个常量函数
getConstLabelRect()

,您可以在其中编写:
itbegin=m_setDrawnLabel.end()itend=m_setDrawnLabel.end()?谢谢。更正@Arunasand为了清楚起见,你是否在课堂上遗漏了
public:
?或者这就是为什么您无法访问编辑的
getLabelRect()。谢谢@arunas您在最后一块中调用代码的上下文是什么?常量成员函数?您可以在其中编写:
itbegin=m_setDrawnLabel.end()itend=m_setDrawnLabel.end()?谢谢。更正@Arunasand为了清楚起见,你是否在课堂上遗漏了
public:
?或者这就是为什么您无法访问编辑的
getLabelRect()。谢谢@arunas您在最后一块中调用代码的上下文是什么?常量成员函数?但在&m_labelRect“返回值类型与函数类型不匹配”处出现新错误@Farsanashid更新了我的答案以包含进一步建议。但在&m_labelRect“返回值类型与函数类型不匹配”处出现新错误@Farsanashid更新了我的答案以包含进一步的建议。std::set::iterator正在返回一个迭代器。迭代器所指向的值的类型本身就是常量。这不正是常量迭代器吗?如果我查看我的STL实现,迭代器和const_迭代器是同一事物的typedef。std::set::iterator返回一个迭代器。迭代器所指向的值的类型本身就是常量。这不正是常量迭代器吗?如果我研究一下我的STL实现,迭代器和const_迭代器是同一事物的typedef。
bool operator<(const CDrawnLabel &rhs) const
{
    //This is the set ordering
    return getLabelRect()->right < rhs.getLabelRect()->right;
}