重载运算符 <使用 const,但不要将其作为 const 插入到映射中

发布于 2024-09-27 18:18:58 字数 943 浏览 5 评论 0 原文

我有一个问题。我有一个带有这样的重载运算符的类。

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,但我不知道如何解决这个问题。

I'm having an issue. I have a class with an overloaded operator like this..

class Foo
{
        friend bool operator<(const Foo &a, const Foo &b);
        ...
};

bool operator<(const Foo &a, const Foo &b)
{
        return a.member < b.member;
}

Then in a function in a class that holds some Foos in a map as keys...

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

and I get an error message like...

error: passing ‘const Foo’ as ‘this’ argument of ‘void Foo::Update()’ discards qualifiers

I believe the reason is that the my_map.insert() is inserting const Foos, but I don't know how to solve this issue.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

羁拥 2024-10-04 18:18:58

map 中的键始终是 const,即使您没有这么说。这样做是为了防止编程错误。

考虑一下如果 Update 更改 member 会发生什么 - 地图数据结构将基于原始排序,但现在 member 已更改,订单可能是错误的!地图将完全损坏 - 您将无法正确查找、插入或删除数据。


因此,解决此问题的一些选项是:

  • 使用不同的数据结构,其中对象是否“乱序”并不重要,例如向量
  • 将更新的数据移到其他地方。有时它确实属于mapped_typemap的第二个模板参数)。有时您可以定义一个新的struct来存储当前的mapped_type以及需要更改的数据。
  • 如果您要更改的内容不会影响类型的可观察状态(例如缓存),那么我可能建议将更改后的数据成员设置为可变并将相关成员函数设置为常量,或将可变数据存储在 scoped_ptr 中。然而,名为 Update 的函数表明正在更新的数据对于该类型来说是基础。

Keys in a map are always const, even if you don't say so. It's like that to prevent programming errors.

Consider what would happen if Update changed member - the map data structure would be based on the original ordering, but now that member 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:

  • Use a different data structure, where it doesn't matter if the objects get "out of order", such as vector.
  • Move the data that gets updated somewhere else. Sometimes it really belongs in the mapped_type (map's second template parameter). Sometimes you can define a new struct to store the current mapped_type, and the data that needs to change.
  • If you were changing something that doesn't affect the type's observable state, like a cache, then I might suggest making the changed data members mutable and making the relevant member functions const, or storing the mutable data in a scoped_ptr. However, a function named Update suggests that the data being updated is fundamental to the type.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文