Карта в карте Map.Clear () ошибка - PullRequest
1 голос
/ 19 июля 2011
void destroy()
{
    AList::const_iterator a;
    for(a = AList.begin(); a != AList.end();)
    {
        if(!a->second.BList.empty())
            a->second.BList.clear();//will give error if not mutable
    }
}
typedef std::map<unsigned int,int> bmap;
typedef std::map<unsigned int,someStruct> Alist;
typedef struct someStruct
{
    float x,y,z;
    bmap BList; //needs to be mutable for Blist.clear() above.
    //mutable bmap BList; //<---like this
} someStruct;

Я случайно наткнулся на мутабельный вариант в похожем, но не в том же вопросе.Мой вопрос в том, правильно ли я поступаю или есть ли какие-либо подводные камни в этом?Заранее благодарю за помощь.

//error given: (if otherwise not mutable)
// error: passing 'const AList' as 'this' argument of 'void std::map<_Key, _Tp, _Compare, _Alloc>::clear() [with _Key = unsigned int, _Tp = int, _Compare = std::less<unsigned int>, _Alloc = std::allocator<std::pair<const unsigned int, int> >]' discards qualifiers

Ответы [ 3 ]

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

Вы пробовали, говоря просто iterator?

AList::iterator a;

const_iterator не позволяет изменять элементы (что-то вроде const в обычном контексте).

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

Вы должны использовать iterator вместо const_iterator, если вы хотите позвонить clear.const_iterator - для случаев, когда вы вызываете только const функции-члены.

Использование mutable не подходит для этой ситуации.Помечайте переменные-члены mutable только в том случае, если они не являются частью видимого состояния объекта, например, кэшированные данные.

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

Код, указанный вами, неверен. destroy должен был быть константой класса, но вы показали это как глобальную функцию. Поскольку / Если destroy является методом const, clear не будет работать с ним.

...