2015-06-06 7 views
0

У меня проблемы с классом C++, который я пытаюсь реализовать.C++ typedef и subclassing

Подкласс 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; 
    }; 
+0

вы можете вставить код, где вы используете MyPairList. BTW, наследующий вектор - не очень хорошая идея. –

+0

Это ребенок-плакат для использования 'auto'. Все, что вам нужно, это 'auto Item = this-> begin();' – Praetorian

+0

@XiaotianPei Я анализирую xml-данные для каждой итерации через xml. Я создаю один из вышеуказанных классов и нажимаю ссылку на коллекции, по имени с его ассоциированными объект и один по идентификатору с ассоциированным объектом. –

ответ

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(); 
+0

'' 'typename std :: vector :: iterator Item = this-> begin();' '' – Bikineev

+0

@Bikineev, хорошие глаза. –

+0

wow вы, ребята, потрясающие, я выбрал ваш ответ, потому что он более подробный и предлагает несколько разных способов решения проблемы. –

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