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;
在类似但不相同的问题中,我只偶然穿过mutable作为选项。我的问题是我做得对吗,或者这样做是否有任何陷阱?感谢您的帮助。
//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
答案 0 :(得分:1)
如果您打算致电iterator
,则应使用const_iterator
代替clear
。 const_iterator
适用于仅调用const
成员函数的情况。
使用mutable
不适合这种情况。仅标记成员变量mutable
,如果它们不是对象可见状态的一部分,例如缓存数据。
答案 1 :(得分:1)
您是否尝试过,简单iterator
?
AList::iterator a;
const_iterator
不允许成员进行修改(在正常情况下有些像const
一样)。
答案 2 :(得分:0)
您提供的代码不正确。 destroy
应该是类的const成员,但是您已将其显示为全局函数。自/如果destroy
是const方法,clear
将不起作用。