2011-07-25 165 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

相關問題