Что не так с моим использованием поиска стандартной библиотеки C ++? - PullRequest
14 голосов
/ 19 апреля 2011

Я пытаюсь использовать алгоритм find стандартной библиотеки C ++ следующим образом:

  template<class T>
  const unsigned int AdjacencyList<T>::_index_for_node(
      const std::vector<T>& list, const T& node
  ) throw(NoSuchNodeException)
  {
    std::vector<T>::iterator iter = std::find(list.begin(), list.end(), node);
  }

Когда я пытаюсь скомпилировать, я получаю следующие ошибки:

In file included from ../AdjacencyList.cpp:8:
../AdjacencyList.h: In member function ‘const unsigned int Graph::AdjacencyList<T>::_index_for_node(const std::vector<T, std::allocator<_Tp1> >&, const T&)’:
../AdjacencyList.h:99: error: expected ‘;’ before ‘iter’
../AdjacencyList.h:100: error: ‘iter’ was not declared in this scope
In file included from ../AdjacencyListTest.cpp:9:
../AdjacencyList.h: In member function ‘const unsigned int Graph::AdjacencyList<T>::_index_for_node(const std::vector<T, std::allocator<_Tp1> >&, const T&)’:
../AdjacencyList.h:99: error: expected ‘;’ before ‘iter’
../AdjacencyList.h:100: error: ‘iter’ was not declared in this scope
../AdjacencyList.h: In member function ‘const unsigned int Graph::AdjacencyList<T>::_index_for_node(const std::vector<T, std::allocator<_Tp1> >&, const T&) [with T = int]’:
../AdjacencyList.h:91:   instantiated from ‘const std::vector<T, std::allocator<_Tp1> > Graph::AdjacencyList<T>::neighbours(const T&) [with T = int]’
../AdjacencyListTest.cpp:18:   instantiated from here
../AdjacencyList.h:99: error: dependent-name ‘std::vector::iterator’ is parsed as a non-type, but instantiation yields a type
../AdjacencyList.h:99: note: say ‘typename std::vector::iterator’ if a type is meant

Я чувствую, что "имя-зависимого" std :: vector :: iterator 'анализируется как не тип, но создание экземпляра дает тип "бит" содержит ключ к пониманию того, что я делаю неправильно, но мой горох -мозг не может извлечь смысл.

Обновление: Мне нужно было добавить typename согласно принятому ответу, а также использовать const_iterator, поэтому проблемная строка кода стала такой:

    typename std::vector<T>::const_iterator iter = std::find(list.begin(), list.end(), node);

1 Ответ

33 голосов
/ 19 апреля 2011
std::vector<T>::iterator iter = /* .... */; 

iterator является зависимым именем (фактически оно зависит от параметра типа T). Предполагается, что зависимые имена не являются именами типов, если вы не используете typename:

typename std::vector<T>::iterator iter = /* .... */;

Для получения дополнительной информации прочитайте статью часто задаваемых вопросов о переполнении стека C ++ «Где и почему я должен указывать« template »и« typename »для зависимых имен?»

Вам также нужно будет использовать const_iterator, поскольку list соответствует стандарту. Вы, вероятно, должны также отбросить спецификацию исключений; "никогда не пишите спецификацию исключений."

...