gpt4 book ai didi

c++ - 关于模板中随机访问迭代器的运算符+重载的问题

转载 作者:搜寻专家 更新时间:2023-10-31 00:20:05 25 4
gpt4 key购买 nike

我想在列表类中重载迭代器的“+”运算符,比如

list<double>::iterator operator+(const list<double>::iterator& it, int n)

这很好用。但是,当我尝试将其实现为模板时,例如

template<class T>
typename list<T>::iterator operator+(const typename list<T>::iterator& it, int n)

我收到错误消息,例如,

no match for 'operator+' in 'it + small_index'

想不通原因...

代码附在下面,

#include<iostream>
#include<list>
using namespace std;

template<class T>
ostream& operator<< (ostream& os, const list<T>& l)
{
typename list<T>::const_iterator i = l.begin();
for (;i!=--l.end();i++)
os<<*i<<";";
os<<*i<<endl;
return os;
}

template<class T> //this is where it goes WRONG.
//If don't use template, delete "typename", T->double, runs well
typename list<T>::iterator operator+(const typename list<T>::iterator& it, int n)
{
typename list<double>::iterator temp=it;
for(int i=0; i<n; i++)
temp++;
return temp;
}

template <class T>
void small_sort(list<T>& l)
{
int n = l.size();
typename list<T>::iterator it = l.begin();
for(int i=0; i<n-1; i++)
{
//Find index of next smallest value
int small_index = i;
for(int j=i+1; j<n; j++)
{
if(*(it+j)<*(it+small_index)) small_index=j;
}
//Swap next smallest into place
double temp = *(it+i);
*(it+i) = *(it+small_index);
*(it+small_index)=temp;
}
}

int main()
{
list<double> l;
l.push_back(6);
l.push_back(1);
l.push_back(3);
l.push_back(2);
l.push_back(4);
l.push_back(5);
l.push_back(0);

cout<<"=============sort the list=============="<<endl;
small_sort(l);
cout<<l;
return 0;
}

最佳答案

问题是论证在那种情况下是不可推导的。

template<class T>
typename list<T>::iterator operator+(const typename list<T>::iterator& it, int n);

当你在那里使用迭代器时,编译器必须生成具有任何给定类型的所有可能的 list 实例,并尝试将内部类型 iterator 与您传递的参数,请注意,一旦您将模板添加到组合中,所有类型 的集合实际上是无限的,因为您可以使用同一模板的实例化来实例化一个模板无限.

我建议您完全避免该问题并使用 std::advance,这是推进迭代器的惯用方式。

关于c++ - 关于模板中随机访问迭代器的运算符+重载的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6793137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com