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. Lestd
espace de noms désigne l'utilisation de la Norme C++ de la Bibliothèque. Pendant ce temps, en prenant de l'utilisation destd::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
:)
.
Vous devez vous connecter pour publier un commentaire.
iterator
est une personne à charge nom (en fait, il dépend sur le paramètre de typeT
). Dépendant de noms sont supposées ne pas les types de nom, sauf si vous utiliseztypename
:Pour en savoir plus, lisez le Dépassement de Pile C++ entrée de la FAQ "Où et pourquoi dois-je mettre “modèle” et “typename” sur dépendante des noms?"
Vous aurez également besoin d'utiliser
const_iterator
, depuislist
est const-qualifiés. Vous devriez probablement baisse de la spécification d'exception ainsi, il est préférable de "ne jamais écrire une spécification d'exception."