2011-07-25 16 views
0

私は、次のコードをコンパイルしよう...std :: mapを使用しているときにこのエラーが発生します。どうして?

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

任意のアイデア、何を

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 

私は次のエラーを取得するに...起こっていますか?

+0

あなたのキーが実際に 'void *'ポインタである場合、なぜそれらを 'unsigned long'sに変換していますか? –

+0

'std :: map 'を使ってみませんか? – neuront

答えて

3

エラーは言う:

addrlong unsigned int」から「void*」から

無効な変換を明らかにvoid*です。マップのキータイプはunsigned longです。 unsigned long(または少なくとも整数に変換可能なもの)をoperator[]に渡す必要があります。

コード内の整数((unsigned long)addr)へのポインタのキャストは奇妙です。これを行う理由は本当にありません。 std::mapのキータイプがポインタ型でなければなりませんならば、あなたはそれポインタ型にする必要があります...

+0

ああ、私は531行でもaddrを型キャストする必要があります! – MetallicPriest

+1

最初に使用するためにタイプキャストします*のみ*。 C++では、キャストはキャスト変数の型を永久に変更しません。将来の 'addr'の使用は、' unsigned long'ではなく 'void *'として使用します。 –

+0

@MetallicPriest:技術的には、void *がunsigned longよりも大きなオブジェクトである可能性があるので、これが爆発する可能性があります。だから、あなたの地図にキーをvoid *として残さないのはなぜですか?それから、何かを投げる必要はありません。 –

1

pagesMapは、あなたのaddrはタイプvoid*であり、それはタイプunsigned long

であることが必要である <unsigned long, MemPages>のマップです
0

あなたがaddrvoid *、APPAをキャストしているので、マップの演算子[]

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

addr引数をキャストしてみあなたの挿入物にunsigned longまで)、それをあなたの検索にキャストする必要があります。

上記のコードのどこかにaddrをキャストしていても、後で使用するために変数の基本データ型を変更したというわけではありません。キャストはその特定の用途にのみ適用されます。 unsigned longとして扱われる必要がある場合はいつでも、再度キャストする必要があります。

+0

うん、私はそれを見落とした知っている:)! – MetallicPriest

関連する問題