Используйте const_iterator
как:
map<string,Shopable*>::const_iterator it = mymap.begin();
Из ошибки ясно, что mymap.begin()
возвращает const_iterator
. Это потому, что mymap
- это const
в функции, где вы написали это, что-то вроде следующего:
void f(const std::map<int,int> & m)
{ //^^^^^ note this
std::map<int,int>::const_iterator it = m.begin(); //m is const in f()
//^^^^^ note this
}
void g(std::map<int,int> & m)
{
std::map<int,int>::iterator it = m.begin(); //m is non-const in g()
}
То есть контейнер const
(будь то std::map
, std::vector
и т. Д.) Возвращает const_iterator
, а неконстантный контейнер возвращает iterator
.
Каждый контейнер имеет перегруженные функции begin()
и end()
. Таким образом, контейнер const
вызывает перегруженный begin()
, который возвращает const_iterator
, а неконстантный контейнер вызывает другой перегруженный begin()
, который возвращает iterator
. И то же самое для end()
перегруженных функций.