Я получаю эту ошибку при использовании 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**
Любая идея, что происходит?
4 ответа
Ошибка говорит:
неверное преобразование из '
void*
кlong unsigned int
'
addr
по-видимому void*
; ключевой тип вашей карты unsigned long
, Вам нужно пройти unsigned long
(или, по крайней мере, то, что конвертируется в целое число), чтобы operator[]
,
Приведение указателя на целое число ((unsigned long)addr
) в вашем коде странно: на самом деле не должно быть никаких причин для этого. Если тип ключа std::map
должен быть указатель типа, тогда вы должны сделать его указателем типа...
Так как вы кастуете addr
(а void *
видимо?) чтобы unsigned long
в вашей вставке, вы также должны привести его к поиску.
Тот факт, что вы бросили addr
где-то в приведенном выше коде не означает, что вы изменили основной тип данных переменной для последующего использования. Приведение применяется только к этому конкретному использованию. Вам нужно будет снова разыграть его там, где он должен рассматриваться как unsigned long
,
pagesMap
это карта <unsigned long, MemPages>
ваш адрес имеет тип void*
и это должно быть типа unsigned long
Попробуйте сыграть addr
аргумент оператора карты []
MemPages& mp = pagesMap[(unsigned long)addr];