Я получаю эту ошибку при использовании 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 должен быть указатель типа, тогда вы должны сделать его указателем типа...

Так как вы кастуете addrvoid *видимо?) чтобы unsigned long в вашей вставке, вы также должны привести его к поиску.

Тот факт, что вы бросили addr где-то в приведенном выше коде не означает, что вы изменили основной тип данных переменной для последующего использования. Приведение применяется только к этому конкретному использованию. Вам нужно будет снова разыграть его там, где он должен рассматриваться как unsigned long,

pagesMap это карта <unsigned long, MemPages> ваш адрес имеет тип void* и это должно быть типа unsigned long

Попробуйте сыграть addr аргумент оператора карты []

MemPages& mp = pagesMap[(unsigned long)addr];
Другие вопросы по тегам