迭代器很新,在这里遇到了很多麻烦。 错误似乎很简单,但我不确定如何在类模板中定义类型迭代器。 非常感谢帮助!
标题文件:
template<class T>
class e
{
private:
set<T> items; //set container for items of type T
public:
typename set<T>::iterator it;
bool add(T);
int size();
typename set<T>::iterator begin(); //return iterator it (beginning of items)
typename set<T>::iterator end(); //return iterator it (end of items)
};
发生错误的代码块:
for(e<CD>::iterator p=updatableAlbumSet.begin(); p!=updatableAlbumSet.end();p++){
((CD)(*p)).saveAlbum(fout);
}
错误:
error: no type named 'iterator' in 'e<CD>'
for(e<CD>::iterator p=updatableAlbumSet.begin(); p!=updatableAlbu...
答案 0 :(得分:0)
您需要定义迭代器的类型
#include <iostream>
#include <set>
using namespace std;
template<class T>
class e
{
private:
set<T> items; //set container for items of type T
public:
typedef typename set<T>::iterator iterator;
bool add(T item)
{
items.insert(item);
return true;
}
int size();
typename set<T>::iterator begin() //return iterator it (beginning of items)
{
return items.begin();
}
typename set<T>::iterator end() //return iterator it (end of items)
{
return items.end();
}
};
int main()
{
e<int> updatableAlbumSet;
updatableAlbumSet.add(1);
updatableAlbumSet.add(2);
updatableAlbumSet.add(3);
for(e<int>::iterator p=updatableAlbumSet.begin(); p!=updatableAlbumSet.end();p++)
{
//do something
cout<<*p<<endl;
}
return 0;
}
使用set中的一些自定义类修改代码:
#include <iostream>
#include <set>
using namespace std;
template<class T, class Comp>
class e
{
private:
set<T, Comp> items; //set container for items of type T
public:
e(Comp cmp):items(cmp)
{
}
typedef typename set<T, Comp>::iterator iterator;
bool add(T item)
{
items.insert(item);
return true;
}
int size();
typename set<T, Comp>::iterator begin() //return iterator it (beginning of items)
{
return items.begin();
}
typename set<T, Comp>::iterator end() //return iterator it (end of items)
{
return items.end();
}
};
struct CD{
CD(int y):x(y){}
int x;
};
bool compare(CD obj1, CD obj2)
{
return obj1.x < obj2.x;
}
int main()
{
typedef bool(*FnPtr)(CD, CD);
FnPtr fnPtr = compare;
e<CD, FnPtr> updatableAlbumSet(fnPtr);
CD obj1(1);
CD obj2(2);
CD obj3(3);
updatableAlbumSet.add(obj1);
updatableAlbumSet.add(obj2);
updatableAlbumSet.add(obj3);
for(e<CD, FnPtr >::iterator p = updatableAlbumSet.begin();
p!=updatableAlbumSet.end();
p++)
{
//do something
cout<<(*p).x<<endl;
}
return 0;
}