c ++ typedef和subclassing

时间:2015-06-06 05:39:16

标签: c++ templates c++11 stl

我在尝试实现的c ++类时遇到了一些麻烦。

我是std::vector<T>的子类,但我无法获得迭代器。这是我的示例代码:

这一行

MyPairList::iterator Item = this->begin();

我无法获得模板类的迭代器。

我如何解决这个问题以及为什么会发生这种情况,因为现在我完全不知所措。这也在我的.h文件中描述,没有.cpp文件。

#include <string>
#include <unordered_map>
#include <vector>

using namespace std;

    template<typename T>
    class MyPairList : public vector<T>
    {
    public:
        void Form()
        {
            _idColl.clear();
            _nameColl.clear();


            MyPairList::iterator Item = this->begin();
            for ( ; Item != this->end() ;  ++Item)
            {
                _idColl.insert(make_pair( (*Item)->ID, (*Item) ));
                _nameColl.insert(make_pair( (*Item)->Name, (*Item) ));
            }
        }

        T Lookup(int pID)
        {
            if (_idColl.find(pID) != _idColl.end())
            {
                return _idColl[pID];
            }

            return T();
        }

        T Lookup(const string &pName)
        {
            if (_nameColl.find(pName) != _nameColl.end())
            {
                return _nameColl[pName];
            }

            return T();
        }

        MyPairList()
        {
        }

    private:
        unordered_map<int, T> _idColl;
        unordered_map<string, T> _nameColl;
    };

2 个答案:

答案 0 :(得分:1)

而不是

MyPairList::iterator Item = this->begin();

使用

typename std::vector<T>::iterator Item = this->begin();

另一种选择是创建类型别名。

using iterator = typename std::vector<T>::iterator;
using const_iterator = typename std::vector<T>::const_iterator;

然后,您可以使用:

iterator Item = this->begin();

答案 1 :(得分:0)

typename MyPairList::iterator Item = this->begin();