Quel est le problème avec mon utilisation de C++ standard library trouver?

Je suis en train d'utiliser le C++ standard library find algorithme comme ceci:

  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);
  }

Lorsque j'essaie de compiler, j'obtiens ces erreurs:

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

Je me sens comme la "charge-nom ‘std::vector::iterator" est analysée comme un non-type, mais l'instanciation des rendements de type" bit détient la clé de la compréhension de ce que je fais mal, mais mon pea-cerveau ne peut pas extraire le sens.

Mise à jour: j'ai besoin d'ajouter un typename, comme par le a accepté de répondre, et également utiliser une const_iterator, de sorte que la ligne de code problématique est devenue:

    typename std::vector<T>::const_iterator iter = std::find(list.begin(), list.end(), node);
  • Il n'y a pas de std::find dans la STL. Le std espace de noms désigne l'utilisation de la Norme C++ de la Bibliothèque. Pendant ce temps, en prenant de l'utilisation de std::find aurait réduit la question un peu; dans ce cas, vous avez une personne à charge nom.
  • L'un des rares cas où les dernières lignes du message d'erreur contient les informations les plus utiles...
  • L'un des rares cas où un message d'erreur à partir d'un compilateur C++ contient en fait une utile, exploitable suggestion. 😉
  • Oui, vous êtes techniquement correcte. Pour la plupart des fins, STL == C++ de la bibliothèque standard, mais il ya quelques différences, et je devrais avoir été clair.
  • Vous aurez également besoin de const_iterator, pas d'itérateur.
  • Pouah à nouveau avec la STL/stdlib argument... ne pas les gens jamais s'en lasser?
  • Je vous entends, et, en fait, ne savent pas que la référence à std::find() comme une STL algorithme a été incorrecte de toute façon. Je l'ai fait chercher, et je suppose que c'est mieux d'être 100% correct. Encore "STL trouver" a plus de bague à elle que "ISO C++ standard library trouve"! 😉
  • en fait je disais que souligner l'habitude STL/stdlib argument à chaque fois que quelqu'un écrit "STL" au lieu de "le modèle de la partie de la bibliothèque standard" ou quel que soit le terme est ressenti comme correct dans le long terme est tout à fait ennuyeux et inutile.
  • Le "ennuyeux et inutile" était le peu que j'était d'accord avec, mais aussi poliment que je le pouvais. 😉
  • euh, désolé, pour une raison que j'ai compris l'exact contraire. Heureux que nous sommes d'accord, alors :) .

InformationsquelleAutor Josh Glover | 2011-04-19