使用operator[]访问std::vector<std::shared_ptr<Character>>时出现编译错误的排查与解决
C++迭代器使用错误:解决vector迭代器访问问题
你遇到的这个编译错误和自定义Character类的operator[]、operator*完全没关系,问题出在你对迭代器的使用方式搞错了。
错误原因分析
你写的(*gameboard[i]).coordinates这里犯了两个逻辑错误:
gameboard是vector,它的operator[]需要的是整数索引(比如0、1这种),但你传进去的i是迭代器类型,这就导致了编译器报错“找不到匹配的operator[]”——因为vector根本不接受迭代器当索引用。- 就算你想用迭代器访问元素,正确的写法应该是直接解引用迭代器
*i,而不是去操作原容器。
修正后的代码
把循环里的判断语句改成下面这样就可以了:
void move(const GridPoint & src_coordinates, const GridPoint & dst_coordinates) { for (std::vector<std::shared_ptr<Character>>::iterator i = gameboard.begin(); i != gameboard.end() ; i++ ) { // 直接解引用迭代器得到shared_ptr,再访问coordinates成员 if ( (*i)->coordinates == src_coordinates) { // 这里写移动逻辑:比如把这个元素的坐标改成dst_coordinates // 或者如果是要交换位置,需要先处理目标位置的元素,再修改当前元素的坐标 (*i)->coordinates = dst_coordinates; break; // 找到目标角色后可以直接退出循环,提高效率 } } }
额外优化建议
如果你用的是C++11及以上版本,可以用范围for循环让代码更简洁:
void move(const GridPoint & src_coordinates, const GridPoint & dst_coordinates) { for (auto& char_ptr : gameboard) { if (char_ptr->coordinates == src_coordinates) { char_ptr->coordinates = dst_coordinates; break; } } }
总结
- 不需要为
Character类实现任何额外的operator[]或operator*,vector的迭代器和shared_ptr已经帮你实现了正确的访问方式。 - 迭代器的正确用法是直接解引用(
*i)来获取容器中的元素,而不是把迭代器传给容器的operator[]。
内容的提问来源于stack exchange,提问作者Saleh
相关产品推荐
相关产品推荐

