C++迭代器适配排序传入vector/forward_list报iterator_traits错误
错误原因
你代码里的核心问题是模板参数类型传错:
调用testSort(vec)时,模板形参Iter会被推导为你传入的容器类型(也就是std::vector<int>、std::forward_list<int>),但std::iterator_traits要求传入的是迭代器类型,直接传容器类型进去自然找不到iterator_category成员,就触发了你看到的编译报错。
除此之外你的前向迭代器排序分支还有一个隐藏bug:vector<decltype(*beg)>中*beg返回的是元素的左值引用,会导致你尝试声明vector<int&>,这是C++不允许的引用类型容器,编译也会报错。
修复步骤
- 修改
testSort中获取迭代器分类的逻辑:传入iterator_traits的应该是容器对应的迭代器类型,而非容器本身,用decltype(c.begin())即可拿到正确的迭代器类型。 - 修正前向迭代器分支的vector元素类型:通过
std::iterator_traits<For>::value_type获取迭代器指向的值类型,避免推导出引用类型。
修正后可运行代码
#include<iostream> #include<vector> #include<forward_list> #include<iterator> #include<algorithm> #include<typeinfo> using namespace std; template<typename Ran> void sort_helper(Ran beg, Ran end, random_access_iterator_tag){ // 随机访问迭代器:直接调用标准库sort sort(beg, end); } template<typename For> void sort_helper(For beg, For end, forward_iterator_tag){ // 前向迭代器:拷贝到vector排序后再拷回 vector<typename iterator_traits<For>::value_type> vec{beg, end}; sort(vec.begin(), vec.end()); copy(vec.begin(), vec.end(), beg); } template<class Container> void testSort(Container& c){ // 这里传入iterator_traits的是迭代器类型,不是容器类型 using Iter = decltype(c.begin()); sort_helper(c.begin(), c.end(), typename std::iterator_traits<Iter>::iterator_category{}); } int main(int argc, char** argv){ vector<int> vec = {3, 5, 1, 2, 3, 1, 5, 88}; forward_list<int> flst = {6, 4, 6, 1, 4, 77, 1, 23, 2, 4}; testSort(vec); testSort(flst); for(auto& x:vec){ cout<<x<<" "; }cout<<"\n"; for(auto& x:flst){ cout<<x<<" "; }cout<<"\n"; }
运行输出:
1 1 2 3 3 5 5 88 1 1 2 4 4 4 6 6 23 77
内容的提问来源于stack exchange,提问作者steyn
相关产品推荐
相关产品推荐

