返回Iterator时的转换错误:std::find迭代器类型不匹配问题
解决std::find迭代器类型不匹配的编译错误
嘿,我一眼就揪出问题所在了——你的do_find函数里,参数v是**const T &类型的引用**,调用v.begin()和v.end()时,容器会返回const_iterator(只读迭代器),但你的函数声明的返回类型是typename T::iterator(可读写迭代器)。这两种迭代器类型不能隐式转换,所以编译器才会抛出那个类型不匹配的错误。
给你两种针对性的解决方案,按需选择就行:
方案一:返回const_iterator(适合不需要修改容器元素的场景)
把函数的返回类型改成typename T::const_iterator,同时主函数里的迭代器也对应改成const_iterator:
#include <algorithm> #include <vector> template<typename T> typename T::const_iterator do_find(const T &v, int f) { return std::find(v.begin(), v.end(), f); } int main() { std::vector<int> v = {1, 2, 3, 3, 4, 6}; std::vector<int>::const_iterator it; it = do_find(v, 3); return 0; }
方案二:使用非const引用(需要修改容器元素的场景)
如果你的场景需要通过返回的迭代器修改容器元素,那把函数的参数改成非const的引用就行,这样v.begin()返回的就是普通iterator,和返回类型匹配:
#include <algorithm> #include <vector> template<typename T> typename T::iterator do_find(T &v, int f) { return std::find(v.begin(), v.end(), f); } int main() { std::vector<int> v = {1, 2, 3, 3, 4, 6}; std::vector<int>::iterator it; it = do_find(v, 3); return 0; }
额外技巧:C++14及以上的自动类型推导
如果你的编译器支持C++14或更高版本,还可以用auto自动推导返回类型,这样函数能自动适配传入的容器是const还是非const,返回对应的迭代器类型,代码更简洁:
#include <algorithm> #include <vector> template<typename T> auto do_find(const T &v, int f) { return std::find(v.begin(), v.end(), f); } int main() { std::vector<int> v = {1, 2, 3, 3, 4, 6}; // 这里的it会被自动推导为const_iterator auto it = do_find(v, 3); return 0; }
内容的提问来源于stack exchange,提问作者Thomas Dupond
相关产品推荐
相关产品推荐

