概述
下面是我们自己写一个泛型算法的迭代器类。
template <class elemType>
class Iterator
{
..... //具体定义的内容省略
}
template <class elemType>
class Array{
.....
Iterator<elemType> begin() { ..... } //模仿泛型算法的应用
Iterator<elemType> end() { ...... }
}
#include<algorithm>
int main()
{
int a[] = {1, 2, 3, 4, 5, ,6 , 7};
Array<int> iA(a, a+7);
Iterator<int> iter = iA.begin(); //自定义迭代器的应用
Iterator<int> iter_end = iA.end();
int minvalue = *min_element(iter, iter_end);
}
编译时,出现如下问题:
error C2039: 'iterator_category' : is not a member of 'Iterator<elemtype>'
......
error C2146: syntax error : missing ':' before identifier ' iterator_category'
error C4430: missing type specifier-int assumed. Note:C++ does not support default-int
error C2602: 'std::iterator_traits<_Iter>::iterator_category' is not a member of a base class of 'std::iterator_traits<_Iter>'
....... //省略大部分报错,共有几十个错误,但往往一下报错那么多的时候,错误更少,也许只是一个类型变化,函数调用的问题等等,所以我们不要被那些数字吓倒。
下面是解决方案:
其实只要在class Iterator 后加public iterator<forward_iterator_tag, elemType>即
template <class elemType>
class Iterator : public iterator<forward_iterator_tag, elemType>
{
........
}
这样问题就解决啦!改动是不是很小!另外提醒使用iterator要调用#include<iterator> std::iterator不要忘了哦,要不然又有新的问题了。
------------------------------------------------------------分割线----------------------------------------------------------------------
下面提供自定义迭代器的另一种实现,代码如下:
#include <iostream>
#include <vector>
#include <list>
#include <iterator>
template <class BDIter>
void alg(BDIter, BDIter, std::bidirectional_iterator_tag)
{
cout << "bidirectional_iterator_tagn";
}
template <class RAIter>
void alg(RAIter, RAIter, std::random_access_iterator_tag)
{
cout << "random_access_iterator_tagn";
}
template <class Iter>
void alg(Iter first, Iter last )
{
alg(first, last, std::iterator_traits<Iter>::iterator_category());
}
int main()
{
std::vector<int> v;
alg(v.begin(), v.end());
std::list<int> l;
alg(l.begin(), b.end());
return 0;
}
打印信息我这就不写出来了,如果有兴趣可以自己去试验,嘻嘻!
最后
以上就是呆萌信封为你收集整理的关于自定义迭代器类出现的问题可能解决方案的全部内容,希望文章能够帮你解决关于自定义迭代器类出现的问题可能解决方案所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复