2011-11-02 64 views
1

更新通过迭代器修改std :: set元素:为什么我的代码不能编译?

这是给我麻烦的方法:

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

这里是卷曲::规范和卷曲:: 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

这是为什么,我错过了什么?

在此先感谢!

+14

错误或它没有发生。 –

+0

如果您使用GCC(即'g ++')编译ypur代码,则应该将'-Wall'传递给编译器,并改进您的代码,直至不再有任何警告。你没有告诉使用关于编译器报告的错误。 –

+0

@Basile Starynkevitch:VC2010。启用了Wall,感谢您的提示。但是,第三方标题使它不可能。我的默认警告lvl是4中的3个。 –

回答

2

在实践中,一组的成员是const(不变),所以你不能要求他们非const成员函数。

如果允许,您可以更改它们的值并使该集合的排序无效。

+1

是的,我刚刚已经明白了今天。我希望容器对每个非const操作重新排序。 –

3

auto将放弃参考。我不知道auto&是否有效,但是如果没有,您必须明确指定CUrl&

+0

不知道自动丢弃参考,谢谢。但是,原始代码是:'it-> normalize()。makeFull();',错误是:'CUrl :: normalize':无法将'this'指针从'const CUrl'转换为'CUrl&'' '.makeFull'的左边必须有class/struct/union' –

+1

为此,请参阅bithead61的答案。 –

2

看起来_references.begin()调用正在返回一个const_iterator而不是常规迭代器。 _references变量是否是对集合的const引用?尽管如此,这绝对是迭代器的状态const的一个问题。下面的代码编译:

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

我有同样的印象。但不,这是一个私人班级成员:'std :: set \t _references;' –

相关问题