2011-07-25 169 views
0

当我尝试编译下面的代码...使用std :: 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** 

任何想法,这是怎么回事?

+0

如果你的键实际上是'void *'指针,为什么你将它们转换为'unsigned long's? –

+0

为什么不使用'std :: map '? – neuront

回答

3

错误说:从“void*”到“long unsigned int

addr

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

在代码中投射一个指向整数((unsigned long)addr)的指针很奇怪:确实不应该有任何理由这样做。如果std::map的密钥类型应该是一个指针类型,那么你应该让一个指针类型...

+0

嗯,好的,我需要在第531行上指定addr! – MetallicPriest

+1

您只为*第一次使用*注释*。在C++中,强制转换不会永久更改强制变量的类型。以后任何'addr'的使用都会将它用作'void *',而不是'unsigned long'。 –

+0

@MetallicPriest:技术上来说,它的void *是比'unsigned long'更大的对象,所以有可能会炸毁它。那么,为什么不把密钥留在你的地图上作为一个空白*?那么就没有必要投什么东西了。 –

1

pagesMap是地图<unsigned long, MemPages>你的地址是void*类型,并且它需要类型的unsigned long

0

尝试铸造addr参数地图的运营商[]

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

既然你铸造addr(一void *,APPA在你的插入中,unsigned long),你也需要将它转换为你的检索。

上面的代码中某处出现addr这一事实并不意味着您已经更改了变量的基本数据类型以备后用。演员仅适用于该特定用途。无论需要将其视为unsigned long,您都需要重新投射。

+0

是的,我知道,我忽略了它:)! – MetallicPriest

相关问题