gpt4 book ai didi

c++ - 给定带有指向键的非常量类的指针的 std::map,如何通过指向 const 的指针访问它?

转载 作者:行者123 更新时间:2023-12-02 10:01:34 27 4
gpt4 key购买 nike

有一个类型的 map std::map<A*, B*> m描述了类型 A 的对象和类型 B 的对象之间的对应关系。
有一个功能int exctractInfo(const A *a)需要从 B 类型的对象中读取一些信息对应于 A 类型的给定对象.这是一个语义上不变的操作,什么都不需要改变,我们只需要读取一些信息,但问题是 C++ 不允许访问 map m通过指向 const 的指针.

考虑以下代码:

#include <map>

class A {

};

class B {
int info_;

public:
int info() const { return info_; }
};

std::map<A*, B*> m;

int exctractInfo(const A *a) {
auto it = m.find(a);
if (it != m.end() && it->second) {
return it->second->info();
}
return -1;
}

int main () {
return 0;
}

Here's a link到此代码的在线编译器。我收到以下错误:

error: invalid conversion from 'const A*' to 'std::map::key_type {aka A*}' [-fpermissive]



现在我看到两个解决方案:
  • 重写类型std::map<A*, B*>std::map<const A*, B*> ,因为我可以访问源代码,但这基本上是一种库对象,并且很多代码都依赖于它,因此必须对其进行更改,因此更改映射类型确实不可取;
  • 像这样使用 const cast:auto it = m.find(const_cast<A*>(a)); ,这似乎也不是一个好的解决方案,更像是一个黑客。

  • 我不明白为什么它不起作用。如果 key 是 std::stringint ,例如,我可以访问 std::map<std::string, B*>通过 const std::string正好。那么我的例子有什么问题呢?有没有适当的方法来处理这种情况?

    最佳答案

    I don't understand why it doesn't work. If the key is std::string or int, for example, I can access std::map via const std::string just fine. So what's wrong with my example?



    因为指向非常量数据的常量指针和指向常量数据的非常量指针存在显着差异。您的 map 首先作为键,您尝试通过第二个。因此,如果您是 C++14 之前的版本,则唯一可行的解​​决方案是 const_cast恐怕(当然除了改变键类型)。如果您可以使用 C++14 或更高版本,则可以使用“透明比较”,如 std::map::find() 中所述。 example .为了让它工作,你需要像这样声明你的 map :
    std::map<A*, B*,std::less<>> m;

    live example

    关于c++ - 给定带有指向键的非常量类的指针的 std::map,如何通过指向 const 的指针访问它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62348007/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com