使用STL remove_if时一元谓词报错:bool类型非函数或函数指针
问题分析与解决
错误原因
- remove_if参数传递错误:你调用
remove_if时,第三个参数传的是equalTemplate(...)——这会直接执行谓词对象的operator(),返回一个bool值,但remove_if需要的是可调用对象本身(即谓词实例),而非单次调用后的布尔结果。这就是编译错误(翻译后:“被调用的对象类型是bool,不是函数或函数指针”)的核心原因。 - 谓词构造函数参数存在隐患:当前构造函数使用非const引用参数,若传入临时对象或const对象会触发编译错误,建议改为const引用或直接传值。
修正后的代码
1. 优化谓词类
// 用于remove_if的一元谓词类 class EqualTemplate { private: TableEntry whereValue; int columnIndex; public: // 改为const引用参数,兼容临时对象和const对象传入 EqualTemplate(const TableEntry &value, const int columnIndexIn) : whereValue(value), columnIndex(columnIndexIn) {} // 若目标vector的元素是vector<TableEntry>(每行数据),此参数类型正确 bool operator()(const vector<TableEntry> &inputRow) { return inputRow[static_cast<uint32_t>(columnIndex)] == whereValue; } };
2. 修正remove_if调用逻辑
// 创建谓词实例 EqualTemplate equalTemplate(whereValueEntry, whereColIndex); // 用引用简化重复的长表达式,提升可读性 auto &targetVector = tables[tableName].table[tables[tableName].colNames[whereColName]]; targetVector.erase( remove_if(targetVector.begin(), targetVector.end(), equalTemplate), targetVector.end() );
关键修正点:
- 直接传递
equalTemplate给remove_if,remove_if会在遍历元素时自动调用其operator(),并传入当前元素。 - 引入
targetVector引用,避免重复访问复杂的嵌套结构,减少出错概率。
额外说明
如果你的目标vector元素类型是TableEntry(而非vector<TableEntry>),则需要将谓词的operator()参数改为const TableEntry &,并调整判断逻辑——但从代码上下文判断,你应该是在处理存储行数据的vector。
内容的提问来源于stack exchange,提问作者kevinw1015
相关产品推荐
相关产品推荐

