我在使用 std::map 时收到此错误.为什么

I get this error while using std::map. Why?

本文关键字:为什么 错误 map std      更新时间:2023-10-16

当我尝试编译以下代码时...

struct MemPages
{
  size_t size;
  volatile sig_atomic_t acc;
}; 
typedef std::map<unsigned long, MemPages> PagesMap;
PagesMap pagesMap;
............
pagesMap.insert(pair<unsigned long, MemPages>((unsigned long)addr, memPages ));
............
// This is Line 531
MemPages& mp = pagesMap[addr]; // Error here

我收到以下错误...

**replication.cpp:531: error: invalid conversion from ‘void*’ to ‘long unsigned int’
replication.cpp:531: error:   initializing argument 1 of ‘_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = long unsigned int, _Tp = MemPages, _Compare = std::less<long unsigned int>, _Alloc = std::allocator<std::pair<const long unsigned int, MemPages> >]’
make: *** [all] Error 1**

知道吗,这是怎么回事?

错误说:

从"void*"到"long unsigned int"的转换无效

addr显然是一个void*;地图的密钥类型是unsigned long。 您需要传递一个unsigned long(或者至少是可转换为整数的东西(到 operator[]

在你的代码中强制转换指向整数((unsigned long)addr(的指针是奇怪的:真的不应该有任何理由这样做。 如果std::map的键类型应该是指针类型,那么你应该把它变成指针类型......

由于您要在插入中unsigned long转换addr(显然是void *?(,因此您还需要在检索时将其强制转换。

您在上面的代码中的某处强制转换addr并不意味着您已经更改了变量的基本数据类型以供以后使用。 强制转换仅适用于该特定用法。 您需要在需要将其视为unsigned long的任何地方再次投射它。

pagesMap是您的地址类型void* <unsigned long, MemPages>映射,并且需要是unsigned long类型

尝试将 addr 参数转换为映射的运算符[]

MemPages& mp = pagesMap[(unsigned long)addr];
相关文章: