自从我开始使用std::map
后,每当我点击按钮时,我就开始收到断言错误。我想清除my_map
中的所有内容,并在每次单击按钮时再次开始添加。
my.cpp
typedef std::map<str, MyClass> mapper;
mapper my_map;
void add_map(const str& name, MyClass* l) { /...../ }
void invoke_me()
{
这里我初始化了i
大小为my_map
的变量,但是,它在清除之前返回之前的大小
int i = my_map.size(); // i = 4, my_map.size() = 1
if (!my_map.empty())
{
for (const auto& it : map)
{
// Assert error: map/set iterator not incrementable
const MyClass& l = it.second;
l.on_clicked();
}
}
}
// cont'd
这应该是my_map
的整洁,但我认为它没有做好正确的工作
void clear_map()
{
my_map.clear();
}
implementor.h
struct MyClass
{
std::function<void()> on_clicked;
};
implementor.cpp
MyClass button;
button.on_clicked = [&] {
clear_map();
add_map("MyButton", &button);
};
实际上on_click是一个回调,它必须通过invoke_me
函数调用
的main.cpp
while (RUNNING)
invoke_me();
我会说,这是因为地图尺寸不正确导致即使它超出范围也会保持循环,或者我可能已经损坏或弄乱了该地图。<\ n \ n
/ p>
答案 0 :(得分:2)
可能会有更多问题,但这看起来是主要问题:
button.on_clicked = [&] {
clear_map();
add_map("MyButton", &button);
};
您正在清除地图,并且在您进行迭代时会调用此函数:
for (const auto& it : my_map)
{
// Assert error: map/set iterator not incrementable
const MyClass& l = it.second;
l.on_clicked();
}
您的迭代器因clear而无效。