pas de match pour l'opérateur= à l'aide d'un std::vector
J'ai une classe déclarée comme ceci:
class Level
{
private:
std::vector<mapObject::MapObject> features;
(...)
};
et dans l'une de ses fonctions de membre j'essaie de parcourir ce vecteur comme ceci:
vector<mapObject::MapObject::iterator it;
for(it=features.begin(); it<features.end(); it++)
{
/* loop code */
}
Cela semble simple pour moi, mais g++ me donne cette erreur:
src/Level.cpp:402: error: no match for ‘operator=’ in ‘it = ((const yarl::level::Level*)this)->yarl::level::Level::features.std::vector<_Tp, _Alloc>::begin [with _Tp = yarl::mapObject::MapObject, _Alloc = std::allocator<yarl::mapObject::MapObject>]()’
/usr/include/c++/4.4/bits/stl_iterator.h:669: remarque: les candidats sont: __gnu_cxx::__normal_iterator<yarl::mapObject::MapObject*,
std::vector > >& __gnu_cxx::__normal_iterator<yarl::mapObject::MapObject*,
std::vector > >::operator=(const __gnu_cxx::__normal_iterator<yarl::mapObject::MapObject*, ``std::vector<yarl::mapObject::MapObject, std::allocator<yarl::mapObject::MapObject> > >&)
Ce que quelqu'un sait pourquoi ce qui se passe?
vector<mapObject::MapObject>::iterator it;
? Vous avez manqué un crochet ici.C++de messages d'erreur ressembler à vomir mixte avec plus de vomir et soigneusement placés dans les crochets.
Je n'ai pas utiliser g++ sur une base régulière, mais d'autres compilateurs (à savoir Visual C++ et Intel C++ qui utilise la GDE frontend) ont modèle des messages d'erreur bien plus facile à lire que celui de l'OMI.
OriginalL'auteur Max | 2010-06-14
Vous devez vous connecter pour publier un commentaire.
Je suppose que cette partie de l'erreur décrit votre problème:
Est la fonction de membre dans lequel ce code est trouvé un const-membre qualifié de la fonction? Si oui, vous aurez besoin d'utiliser un
const_iterator
:Si la fonction de membre est const-qualifiés, alors seulement la const-qualifiés surcharges de
begin()
etend()
sur le membre vecteur sera disponible, et ceux-retourconst_iterator
s.Mon problème, merci!
OriginalL'auteur James McNellis
Avez-vous fermer votre support à angle droit ici?
Si vous voulez un vecteur d'objets, votre objet a besoin d'un opérateur=. Ne MapObject en avoir un? Si pas, envisager un vecteur de pointeurs sur des MapObject.
vector<MapObject::iterator> it;
, qui est valide, mais mal. Il devrait êtrevector<MapObject>::iterator it;
.Notez que, sauf si vous explicitement déclarer une copie opérateur d'affectation, le compilateur va vous en fournir un, de sorte que même si vous ne voyez pas dans la définition de classe, elle a encore une.
OriginalL'auteur dmazzoni
Si j'étais vous, je voudrais vérifier pour voir que le mapObject::MapObject a un constructeur par défaut et un opérateur d'affectation.
Quelque part dans l'en-tête de classe, vous devriez voir quelque chose comme:
Ce qui signifie que la classe a un constructeur par défaut et un opérateur d'affectation.
Un std::vector ne peut pas être instancié en utilisant une classe sans constructeur par défaut, et vous ne pouvez pas parcourir le classe comme ci-dessus sans un opérateur d'affectation.
Ajoutez un opérateur d'affectation pour la définition de votre classe et de votre itération de compiler.
std::vector
peut être instancié pour un type sans un constructeur par défaut, vous venez de perdre un peu de la fonctionnalité (par exemple, lorsque vous redimensionnez le vecteur, vous devez fournir un objet à copier dans les nouvelles machines à sous).OriginalL'auteur tmarthal
@James McNellis de réponse (la "green checked" meilleure réponse) correction de mon erreur avec une description similaire, cependant mon erreur a été provoquée par ce que @tmarthal mentionné la réponse de ce post (pas à la définition d'un opérateur d'affectation). Sa suggestion de correction est d'inclure un opérateur d'affectation, mais je voulais juste ajouter que j'ai aussi pu corriger cette erreur en utilisant std::vector<>::const_iterator au lieu de std::vector<>::iterator pour les classes où aucun opérateur d'affectation est définie. Je ne suis pas sûr de savoir si ce vraiment une bonne correction ou tout simplement quelque chose qui a gardé le compilateur de se plaindre cependant.
OriginalL'auteur JonnyB