Возврат итератора по шаблонному вектору - PullRequest
5 голосов
/ 18 октября 2011

Я искал что-то подобное, но не смог найти его (или то, что я нашел, не помогло).Я пытаюсь использовать итератор для вектора класса шаблона, возвращая его и используя его вне класса, как показано в приведенном ниже коде.

#include <iostream>
#include <vector>

using namespace std;

namespace ns {

 template <class T>
 class test {

  private:
   vector<T> container;

  public:
   typedef vector<T>::iterator iterator;

   vector<T>::iterator begin() {
    return container.begin();
   }

   vector<T>::iterator end() {
    return container.end();
   }

 }

};

int main(void) {
 test<int> inters;

 for (ns::test<int>::iterator i = inters.begin(); i != inters.end(); i++) {
  // bla bla bla
 }

 cout << "end" << endl;
 return 0;
}

(вы также можете проверитькод здесь: http://codepad.org/RuXCYF6T)

В строке 15 появляется следующая ошибка:

error: type '__gnu_debug_def::vector<_Tp, std::allocator<_CharT> >' is not derived from type 'ns::test<T>'
compilation terminated due to -Wfatal-errors.

Заранее спасибо.

Ответы [ 3 ]

8 голосов
/ 18 октября 2011

Я получил ошибки, отличные от вас (отсутствует typename, отсутствует ;, отсутствует ns::).Видимо, разные сообщения об ошибках были из разных версий GCC.Вы запускали это под g ++ 4.1.2.Я использую g ++ 4.6.1.

После исправления всех ошибок это работает для меня:

#include <iostream>
#include <vector>

using namespace std;

namespace ns {

 template <class T>
 class test {

  private:
   vector<T> container;

  public:
   typedef typename vector<T>::iterator iterator; // first change: add typename

   typename vector<T>::iterator begin() { // 2nd: add typename
    return container.begin();
   }

   typename vector<T>::iterator end() { // 3rd: add typename
    return container.end();
   }

 }; // 4th: add semi

} // 5th: delete semi

int main(void) {
 ns::test<int> inters; // 6th: add ns::

 for (ns::test<int>::iterator i = inters.begin(); i != inters.end(); i++) {
  // bla bla bla
 }

 cout << "end\n"; // 7th: avoid endl
 return 0;
}

См. Также: http://codepad.org/gcJBCFOD

2 голосов
/ 18 октября 2011

Вам нужно использовать typename:

typedef typename vector<T>::iterator iterator;

и

typename vector<T>::iterator begin()
typename vector<T>::iterator end()

Редактировать:
или просто использовать typedef:

iterator begin()
iterator end()
0 голосов
/ 18 октября 2014

Здесь много дискуссий о шаблонах, типах и зависимых именах здесь . Мне было трудно найти эту страницу. Вот ответ, который я разместил там:

Видимо, требуемый синтаксис немного отличается, когда функция не является членом класса. Обратите внимание на круглые скобки вокруг возвращаемого типа - компилятор жаловался без них.

template<typename T> (typename std::vector<T>::iterator)
              someNonMemberFunction(std::vector<T>& vec, const T& val)
{  return [some std::vector<T>::iterator to an element in vec];
}
...