重载运算符 <使用 const,但不要将其作为 const 插入到映射中
我有一个问题。我有一个带有这样的重载运算符的类。
class Foo
{
friend bool operator<(const Foo &a, const Foo &b);
...
};
bool operator<(const Foo &a, const Foo &b)
{
return a.member < b.member;
}
然后在类中的一个函数中,该类将映射中的一些 Foo 作为键...
void Bar::Update()
{
for (FooItr itr = foos.begin(); itr != foos.end();) {
FooItr test = itr++;
if (!test->first.Check()) { // Check() is const
my_map.insert(*test);
foos.remove(test);
}
}
for (MapItr itr = my_map.begin(); itr != my_map.end(); ++itr) {
itr->first.Update(); // Update is not const
}
}
并且我收到一条错误消息,例如...
error:传递'const Foo ' 作为 'void Foo::Update()' 的 'this' 参数丢弃限定符
我相信原因是 my_map.insert() 正在插入 const Foos,但我不知道如何解决这个问题。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
map
中的键始终是const
,即使您没有这么说。这样做是为了防止编程错误。考虑一下如果
Update
更改member
会发生什么 - 地图数据结构将基于原始排序,但现在member
已更改,订单可能是错误的!地图将完全损坏 - 您将无法正确查找、插入或删除数据。因此,解决此问题的一些选项是:
向量
。mapped_type
(map
的第二个模板参数)。有时您可以定义一个新的struct
来存储当前的mapped_type
以及需要更改的数据。scoped_ptr
中。然而,名为Update
的函数表明正在更新的数据对于该类型来说是基础。Keys in a
map
are alwaysconst
, even if you don't say so. It's like that to prevent programming errors.Consider what would happen if
Update
changedmember
- the map data structure would be based on the original ordering, but now thatmember
has changed, that ordering could be wrong! The map would be completely broken - you wouldn't be able to find, insert or remove data correctly.So, some options to fix this are:
vector
.mapped_type
(map
's second template parameter). Sometimes you can define a newstruct
to store the currentmapped_type
, and the data that needs to change.mutable
and making the relevant member functionsconst
, or storing the mutable data in ascoped_ptr
. However, a function namedUpdate
suggests that the data being updated is fundamental to the type.