vector<自定义类>调用push_back报错:No instance of overloaded function
问题分析与解决方案
为什么push_back报错?
最常见的原因是你把vector以const引用的方式传给了函数,比如:
void processVec(const vector<MyClass>& vec) { vec.push_back(MyClass()); // 这里必然报错 }
因为const修饰的容器只能调用const成员函数,而push_back是修改容器内容的非const函数,编译器会直接拒绝这种调用。
另外也可能是这两种情况:
- 你传给
push_back的参数类型和vector的元素类型不匹配,比如vector<MyClass>却传了MyClass*指针; - 自定义类
MyClass没有合适的拷贝/移动构造函数,导致push_back无法构造元素(不过这种情况报错信息通常会提到构造函数问题)。
实现“匹配类实例删除元素”的正确做法
你需要用erase-remove惯用法来高效删除匹配元素,步骤如下:
- 首先确保你的自定义类支持相等判断:要么重载
==运算符,要么在删除时提供自定义判断逻辑。
方式1:重载==运算符
先给MyClass重载==:
class MyClass { public: int id; // 假设按id判断是否匹配 bool operator==(const MyClass& other) const { return this->id == other.id; } };
然后在函数中删除元素(注意函数形参不能是const引用,因为要修改容器):
void removeMatchingElement(vector<MyClass>& vec, const MyClass& target) { // 用remove把匹配元素移到容器末尾,返回第一个匹配元素的迭代器 auto it = remove(vec.begin(), vec.end(), target); // 删除末尾的匹配元素 vec.erase(it, vec.end()); }
方式2:用lambda自定义匹配逻辑
如果不想重载==,可以直接在remove_if里写判断逻辑:
void removeMatchingElement(vector<MyClass>& vec, int targetId) { auto it = remove_if(vec.begin(), vec.end(), [targetId](const MyClass& elem) { return elem.id == targetId; // 自定义匹配条件 }); vec.erase(it, vec.end()); }
内容的提问来源于stack exchange,提问作者oceanSki
相关产品推荐
相关产品推荐

