无法'this'指针从'const CDrawnLabel'转换为'CDrawnLabel &'

cannot convert 'this' pointer from 'const CDrawnLabel' to 'CDrawnLabel &'

本文关键字:CDrawnLabel 转换 const 指针 this 无法      更新时间:2023-10-16

根据我想要的顺序,我需要一个用户定义的集合。但是当我想访问集合成员时,我遇到了错误对象的类型限定符与成员函数不兼容(当我将鼠标指针放在错误行上时,我会遇到这个错误。标题中提到的错误来自构建后的错误列表)

typedef struct tagRECT
{
    long    left;
    long    top;
    long    right;
    long    bottom;
} RECT;
struct LabelRect : public RECT
{
    bool isIsolatedFrom(LabelRect* pRect)
    {
        if (pRect->right < left ||
        pRect->left > right ||
        pRect->top > bottom ||
        pRect->bottom < top)
            return true;
        return false;
    }
};
class CDrawnLabel
{   public:
    LabelRect     m_LabelRect;
    LabelRect* getLabelRect(){ return &m_LabelRect; }
    bool operator<(CDrawnLabel & rhs)
    {
        //This is the set ordering
        return getLabelRect()->right < rhs.getLabelRect()->right;
    }
}

我有一套类似于

typedef std::set<CDrawnLabel> DrawnLabelSet;
DrawnLabelSet m_setDrawnLabel

我在尝试访问集合成员时出错

    DrawnLabelSet::iterator itbegin,itend;
    LabelRect* pRectSecond;
    itbegin=m_setDrawnLabel.begin();
    itend=m_setDrawnLabel.end();
    pRectSecond=(*itbegin).getLabelRect();// Here I get the error.

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

您必须使getLableRect常量。此外,由于常量成员函数只能返回常量指针/引用,因此该成员应为:

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;
}

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