C++调用list::erase提示no matching function for call报错解决
错误原因
- 触发编译错误的核心原因是
m_list类型声明错误。你当前声明的m_list为二级指针,指向的std::list存储的元素类型是std::list<Myclass*>::iterator(即另一个list的迭代器),但实际使用时你将其作为存储Myclass*类型的list操作:传入erase的参数it类型为std::list<Myclass*>::iterator,和m_list[a]指向的list要求的迭代器类型不匹配,编译器无法找到对应的erase重载版本。 - 代码中还存在两处会引发运行异常的逻辑问题:
- 条件判断处误用赋值符
=代替比较符==,(*it)->condition = true会直接将condition赋值为true,导致所有元素都会进入删除分支。 - 遍历删除逻辑不符合
std::list的迭代器规则:调用erase后传入的迭代器会直接失效,原有写法在erase后仍执行循环头的it++操作,会触发未定义行为,即使编译通过也会出现程序崩溃、元素漏删等问题。
- 条件判断处误用赋值符
可行修复方案
首先修正m_list的类型声明,再调整遍历删除逻辑、修正判断条件,修正后的可运行代码如下:
// 修正m_list类型:二级指针指向存储Myclass*类型元素的list std::list<Myclass*>** m_list; std::list<Myclass*>::iterator it; // 循环头不要写it++,迭代器移动在分支内处理 for(it = m_list[a]->begin(); it != m_list[a]->end(); ) { if ((*it)->condition == true) { // 修正为等值比较 // erase返回删除位置的下一个有效迭代器,直接赋值给it即可 it = m_list[a]->erase(it); } else { // 无需删除时才手动移动迭代器 it++; } }
如果遍历过程不需要执行其他额外逻辑,还可以直接使用std::list自带的remove_if成员函数,代码更简洁,也不会出现迭代器失效问题:
m_list[a]->remove_if([](Myclass* obj_ptr) { return obj_ptr->condition == true; });
内容的提问来源于stack exchange,提问作者Jonghyun
相关产品推荐
相关产品推荐

