Я получаю эту ошибку при использовании std :: map. Зачем? - PullRequest
0 голосов
/ 26 июля 2011

Когда я пытаюсь скомпилировать следующий код ...

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 ]

3 голосов
/ 26 июля 2011

Ошибка говорит:

неверное преобразование из 'void*' в 'long unsigned int'

addr, по-видимому, void*;ключевой тип вашей карты - unsigned long.Вам нужно передать unsigned long (или, по крайней мере, то, что может быть преобразовано в целое число) в operator[].

Приведение указателя на целое число ((unsigned long)addr) в вашем коде нечетно: действительно не должно быть никаких причин делать это.Если тип ключа std::map должен быть указателем, то вы должны сделать его типом указателя ...

2 голосов
/ 26 июля 2011

Поскольку вы преобразуете addr (a void *, очевидно?) В unsigned long во вставке, вам также необходимо привести его к поиску.

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

1 голос
/ 26 июля 2011

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

0 голосов
/ 26 июля 2011

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

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