通过迭代器修改std :: set元素:为什么我的代码没有编译?

时间:2011-11-02 20:13:12

标签: c++ compilation

更新

这是给我带来麻烦的方法:

void A::normalizeUrls()
{
    for (set<CUrl>::iterator it = _references.begin(); it != _references.end(); ++it)
    {
        if (it->isValid())
        {
            it->normalize().makeFull(_baseUrl);
        }
    }
}    

这里是CUrl :: normalize和CUrl :: makeFull

CUrl& makeFull (CUrl&)
{
    return *this;
}
CUrl& CUrl::normalize()
{
    return *this;
}

错误是:CUrl::normalize' : cannot convert 'this' pointer from 'const CUrl' to 'CUrl &'

left of '.makeFull' must have class/struct/union

为什么会这样,我错过了什么?

提前致谢!

3 个答案:

答案 0 :(得分:3)

auto会删除引用。我不知道auto&是否有效,但如果不是,则必须明确指定CUrl&

答案 1 :(得分:2)

似乎_references.begin()调用返回的是const_iterator而不是常规迭代器。 _references变量是对集合的const引用吗?

但这绝对是迭代器的 const 状态的问题。以下代码编译:

if (it->isValid())
{
    CUrl &ref = const_cast<CUrl&>(*it);
    ref.normalize().makeFull(_baseUrl);
}

答案 2 :(得分:2)

实际上,集合的成员是const(不可变),因此你不能在它们上调用非const成员函数。

如果允许,您可以更改其值并使集合的顺序无效。