2010-11-22 45 views
2

Bon SIRS jour,problème C++ STD opérateurs de comparaison Iterator

parce qu'il ressemble à la mienne ne va pas être bon.

J'ai une classe C, qui n'a pas d'enfant, mais a un vecteur fait de pointeurs vers des instances d'une autre classe, nous allons l'appeler B:

class C 
{ 
    public: 
     ... 
     std::vector<B*> elements; 
     ... 
} 

B a aussi un vecteur de pointeurs vers cas d'une autre classe, laissez l'appeler un de:

class B 
{ 
    public: 
     ... 
     std::vector<A*> elements2; 
     ... 
} 

C a une méthode qui itère à travers les éléments des éléments et elements2, et fonctionne comme ceci:

std::vector<B*>::iterator it1; 
std::vector<A*>::iterator it2; 

for (it1=this->elements.begin(); it1!=this->elements.end(); ++it1) 
{ 
    for (it2 = it1->elements2.begin(); it12=it1->elements2.end(); ++it2) 
    { 
     it2->do_something(); //method of class A 
    } 
} 

Mais le compilateur (g ++) ne cesse de me dire qu'il n'y a pas de correspondance pour l'opérateur! = In (hiérarchie de classes).

Est-ce que quelqu'un sait ce que j'ai fait de mal? D'autres opérateurs comme '<' ne semblent pas fonctionner aussi. Je ne suis pas un novice mais c'est la première fois que j'utilise des itérateurs en C++ (ancien programmeur Python) et je n'arrive pas vraiment à comprendre ce qui ne va pas avec mon code.

Merci pour l'aide d'avance, je suis en train de perdre mes cheveux!

Éditer: J'ajoute l'erreur entière pour référence. Je l'ai édité pour répondre à la question, j'espère que je n'ai rien gâché:

aucune correspondance pour 'opérateur! =' Dans 'it1! = ((C *) this) -> C :: éléments .std :: vecteur < _TP, _Alloc> :: end avec _TP = B *, _Alloc = std :: allocateur »

Répondre

4

Vous devriez essayer:

std::vector<B*>::iterator it1; 
std::vector<A*>::iterator it2; 

for (it1=this->elements.begin(); it1 != this->elements.end(); ++it1) 
{ 
    for (it2 = (*it1)->elements2.begin(); it2 != (*it1)->elements2.end(); ++it2) 
    { 
     (*it2)->do_something(); //method of class A 
    } 
} 
  • Dans la boucle interne , vous avez essayé de comparer it1 (de type std::vector<B*>::iterator) avec it1->elements2.end() (de type std::vector<A*>::iterator), donc le compilateur a raison de se plaindre.
  • Vous devez déréférencer le iterator it2 à « portée » un élément de type A*: (*it2)->do_something()

Sur une note côté, il y a probablement plusieurs façons d'améliorer votre code existant, mais je vais seul État une quelques-uns:

  • Je voudrais éviter l'utilisation this->
  • Utilisez typedef pour clarifier votre code impliquant itérateurs
  • I f it1 et it2 ne sont pas utilisés en dehors de la boucle, réduire la portée

Vous pouvez écrire (évidemment, le vecteur typedef « noms ed devraient être plus significatifs):

typedef std::vector<A*> vector_of_A; 
typedef std::vector<B*> vector_of_B; 
for (vector_of_B::iterator it1 = elements.begin(), end1 = elements.end(); it1 != end1; ++it1) 
{ 
    vector_of_A &innerVector = (*it1)->elements2; 
    for (vector_of_A::iterator it2 = innerVector.begin(), end2 = innerVector.end(); it2 != end2; ++it2) 
    { 
     /* ... */ 
    } 
} 
+0

Ce fut une faute de frappe, je suis désolé. it1 (boucle interne) était bien sûr supposé être it2. Il ne compile toujours pas. Edit: j'obtiens l'erreur du compilateur avant la boucle interne, à la fois sur la boucle externe et sur la boucle interne. – Percival

+0

@Percival: réponse éditée – icecrime

+0

Créer des itérateurs à la fin des vecteurs aurait apparemment bloqué les problèmes de l'opérateur, bien que d'autres aient émergé (de ma faute, probablement). Je me demande quelle en était la cause. Je vais essayer de corriger certaines des autres erreurs. Jusque là, c'est la réponse la plus valable. Merci! Edit: fonctionne parfaitement. Meilleure réponse! – Percival

1

Cela devrait compiler:

std::vector<B*>::iterator it1; 
std::vector<A*>::iterator it2; 

for (it1 = elements.begin(); it1 != elements.end(); ++it1) 
{ 
    for (it2 = elements2.begin(); it2 != elements2.end(); ++it2) 
    { 
     it2->do_something(); //method of class A 
    } 
} 

Mais je ne sais pas ce que vous voulez vraiment faire.

1

Vous avez un vecteur vers un pointeur. Pour appeler une fonction sur ce pointeur, vous devez d'abord déréférencer l'itérateur (pour obtenir le pointeur) plutôt que d'appeler la fonction.

for (it1 = elements.begin(); it1 != elements.end(); ++it1) 
{ 
    for (it2 = (*it1)->elements2.begin(); it2 != (*it1)->elements2.end(); ++it2) 
    { 
     (*it2)->do_something(); //method of class A 
    } 
} 

Modifier: Je pense que le problème est ailleurs. Le code suivant se compile bien sur VS2008 et VS2010

class A 
{ 
public: 
    void Fn() 
    { 
    } 
}; 

class B 
{ 
    public: 
     std::vector<A*> elements2; 
}; 

class C 
{ 
    public: 
     std::vector<B*> elements; 

    void Fn() 
    { 
     std::vector< B* >::iterator it1; 
     std::vector< A* >::iterator it2; 

     for (it1 = elements.begin(); it1 != elements.end(); ++it1) 
     { 
      for (it2 = (*it1)->elements2.begin(); it2 != (*it1)->elements2.end(); ++it2) 
      { 
       (*it2)->Fn(); 
      } 
     } 
    } 
}; 
+0

Je suppose que cela résout un problème imprévu, merci! Cependant, le problème de l'opérateur reste toujours, même si votre réponse est utile et valide (et m'a sauvé beaucoup d'ennuis) le problème n'est toujours pas résolu :( – Percival

0

Le code suivant fonctionne avec gcc 4.2.0 sous Linux. Quelle version utilisez-vous?
Peut-être est-ce l'ordre dans lequel vous déclarez les classes ou un autre problème.

#include <vector> 


class A; 
class B; 
class C; 

class A { 
    public: 
    void do_something() {}; 
}; 
class B 
{ 
    public: 
    std::vector<A*> elements2; 
}; 


class C 
{ 
    public: 
    std::vector<B*> elements; 

    void do_this() { 
     std::vector<B*>::iterator it1; 
     std::vector<A*>::iterator it2; 

     for (it1=this->elements.begin(); it1!=this->elements.end(); ++it1) 
     { 
     for (it2 = (*it1)->elements2.begin(); it2 != (*it1)->elements2.end(); ++it2) 
     { 
      (*it2)->do_something(); //method of class A 
     } 
     } 
    }; 
}; 

int main() { 
    C c; 
}; 

~
~