繁体   English   中英

使用std :: map时出现此错误。 为什么?

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

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

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的键类型应为指针类型,则应将其设为指针类型...

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

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

pagesMap<unsigned long, MemPages>的映射,您的地址类型为void* ,它的类型必须为unsigned long

尝试将addr参数转换为地图的operator []

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM