不能将'this'指针从'const CDrawnLabel'转换为'CDrawnLabel&'

时间:2016-03-31 09:17:49

标签: c++ set

我需要根据我想要的顺序设置用户。但是,当我想访问集合成员时,我收到错误 该对象具有与成员函数 兼容的类型限定符(当我将鼠标指针放在错误行上时出现此错误标题中提到的错误是构建后的fromm Error List

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.

2 个答案:

答案 0 :(得分:4)

您收到此错误的原因是因为std::set<T>中的密钥存储为const T。 因此,此(*itbegin)表达式返回const CDrawnLabel。只能从const对象调用const成员函数。

你必须使getLableRect const。此外,由于const成员函数只能返回const指针/引用,因此成员应该是:

const LabelRect* getLabelRect() const { return &m_LabelRect; }

不是必需的,但最好还是制作比较器const,因为它不会修改任何数据。可以做的另一个改进是不应该引用你应该将const ref传递给比较器。

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

答案 1 :(得分:1)

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