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

C++ 我在使用std::map时遇到此错误。为什么?,c++,stl,map,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

当我试图编译以下代码时

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
struct MemPages
{
大小;
挥发性硅原子acc;
}; 
typedef std::map PagesMap;
PagesMap PagesMap;
............
pagesMap.insert(pair((无符号长)addr,memPages));
............
//这是531行
MemPages&mp=pagesMap[addr];//这里出错
我得到以下错误

**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**
**复制。cpp:531:错误:从“void*”到“long unsigned int”的转换无效
replication.cpp:531:错误:初始化“\u-Tp&std::map::operator[](const\u-Key&)[with\u-Key=long unsigned int,\u-Tp=MemPages,\u-Compare=std::less,\u-Alloc=std::allocator]”的参数1
make:**[all]错误1**
知道发生了什么吗?

错误显示:

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

addr
显然是一个
void*
;映射的键类型为
无符号长键
。您需要将一个
无符号long
(或者,至少可以转换为整数的内容)传递给
运算符[]

在代码中强制转换指向整数(
(unsigned long)addr
)的指针是很奇怪的:确实不应该有任何理由这样做。如果
std::map
的键类型应为指针类型,则应将其设置为指针类型…

错误显示:

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

addr
显然是一个
void*
;映射的键类型为
无符号长键
。您需要将一个
无符号long
(或者,至少可以转换为整数的内容)传递给
运算符[]


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

pagesMap
是一个
的映射。你的地址类型是
void*
,它需要类型是
无符号长的
pagesMap
你的地址类型是
void*
,它需要类型是
无符号长的
试试看将
addr
参数强制转换为映射的运算符[]


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


由于要在insert中将
addr
(显然是
void*
)强制转换为
未签名的long
,因此还需要在检索时强制转换


您在上述代码中的某个地方强制转换了
addr
,这并不意味着您已经更改了变量的基本数据类型以供以后使用。强制转换仅适用于该特定用途。如果需要将其视为
无符号长字符

,则需要再次对其进行强制转换,因为您正在将
addr
(显然是a
void*
)强制转换为插入中的
无符号长字符
,您还需要在检索时对其进行强制转换


您在上述代码中的某个地方强制转换了
addr
,这并不意味着您已经更改了变量的基本数据类型以供以后使用。强制转换仅适用于该特定用途。您需要在需要将其视为
无符号long

的任何位置再次对其进行强制转换,啊,好的,我也需要在第531行上键入addr!您只能第一次使用它。在C++中,一个强制转换不会永久改变CAST变量的类型。
addr
的任何未来用途都将其用作
void*
,而不是
无符号长文件
@metallicprate:从技术上讲,void*可能比
无符号长文件
更大,因此可能会爆炸。那么,为什么不把地图的钥匙留作空白*?那么就不需要进行任何转换了。啊,好吧,我也需要在531行输入地址!您只能第一次使用它。在C++中,一个强制转换不会永久改变CAST变量的类型。
addr
的任何未来用途都将其用作
void*
,而不是
无符号长文件
@metallicprate:从技术上讲,void*可能比
无符号长文件
更大,因此可能会爆炸。那么,为什么不把地图的钥匙留作空白*?如果你的键实际上是
void*
指针,为什么你要将它们转换成
无符号长
s?为什么你不直接使用
std::map
?如果你的键实际上是
void*
指针,你为什么要把它们转换成无符号长码?你为什么不直接使用std::map呢?是的,我知道,我忽略了它:)!是的,我知道,我忽略了:)!
MemPages& mp = pagesMap[(unsigned long)addr];