C++图书管理系统中使用std::find时出现"book与const int二元表达式操作数无效"错误的问题求助
嗨,我来帮你捋清楚这个问题的根源和解决办法!
你遇到的错误核心原因其实很直白:std::find在执行比较时,是把容器里的book对象和你传入的int类型booid直接做相等判断,但你只重载了book与book之间的==运算符,完全没定义book和int之间的比较逻辑。
你之前重载的operator*其实帮不上忙——std::find不会自动调用这个运算符去提取ID再比较,它只会严格执行*__first == __value_,也就是直接拿book对象和int值对比,编译器找不到对应的运算符,自然就报错了。
下面给你几个可行的解决方案,你可以根据自己的需求选:
方案1:补充book与int的==运算符重载
你可以在book类外部添加一个非成员的相等运算符,让book对象能直接和int类型的图书ID比较:
// 注意要放在book类的可见范围内,或者在类内声明为友元 bool operator==(const book& b, int bookId) { return b.getBookId() == bookId; } // 可选:补充反向比较,让int和book也能比较,更符合运算符对称性 bool operator==(int bookId, const book& b) { return b == bookId; }
这样std::find里的*__first == booid就有对应的运算符可以调用了。
方案2:用std::find_if替代std::find,自定义判断逻辑
如果你不想修改运算符重载,更灵活的方式是用std::find_if,传入lambda表达式来判断图书ID是否匹配:
void bms::deleteBook(){ int booid; // 重点!你原来的代码里booid是未初始化的,会导致未定义行为,一定要先赋值 cout << "请输入要删除的图书ID:"; cin >> booid; auto itr = find_if(m_books.begin(), m_books.end(), [booid](const book& b) { return b.getBookId() == booid; }); if( itr != m_books.end()){ m_books.erase(itr); cout << "图书删除成功!" << endl; }else{ cout<<"book is not found!!"<<endl; } }
这个方案不需要修改book类的代码,同时也规避了未初始化变量的问题。
方案3:创建临时book对象匹配现有运算符
你可以利用已经重载的book==book运算符,先创建一个临时book对象并设置目标ID,再用这个对象去查找:
void bms::deleteBook(){ int booid; cout << "请输入要删除的图书ID:"; cin >> booid; book tempBook; tempBook.setBookId(booid); auto itr = find(m_books.begin(), m_books.end(), tempBook); if( itr != m_books.end()){ m_books.erase(itr); cout << "图书删除成功!" << endl; }else{ cout<<"book is not found!!"<<endl; } }
这个方案完全复用了你现有的operator==逻辑,只要你的setBookId能正确设置ID,临时对象的其他成员(比如作者名)不会影响比较结果(因为你的operator==只对比ID)。
最后再提个醒:你原来的代码里booid是未初始化的变量,这会导致程序行为不可预测,一定要记得先给它赋值哦!
备注:内容来源于stack exchange,提问作者farida fathima

