我在使用std :: map时遇到此错误。为什么?

时间:2011-07-25 20:29:53

标签: c++ stl map

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

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

任何想法,发生了什么?

4 个答案:

答案 0 :(得分:3)

错误说:

  

从“void*”到“long unsigned int

的无效转换

addr显然是void*;地图的关键类型是unsigned long。您需要将unsigned long(或至少可转换为整数的内容)传递给operator[]

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

答案 1 :(得分:2)

由于您在插入内点addr(显然是void *?)到unsigned long,您还需要将其投射到检索中。

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

答案 2 :(得分:1)

pagesMap<unsigned long, MemPages>地址void*的地图,其地址为unsigned long,且地址必须为{{1}}

答案 3 :(得分:0)

尝试将addr参数转换为地图的运算符[]

MemPages& mp = pagesMap[(unsigned long)addr];