C ++错误:'e <cd>'中没有​​名为'iterator'的类型(迭代器新手)</cd>

时间:2014-10-31 05:19:29

标签: c++ class templates iterator

迭代器很新,在这里遇到了很多麻烦。 错误似乎很简单,但我不确定如何在类模板中定义类型迭代器。 非常感谢帮助!

标题文件:

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...

1 个答案:

答案 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;
}