2017-10-14 6 views
-1

J'ai le code suivant qui est utilisé pour trouver la cible la plus faible d'un vecteur qui est un vecteur contenant un pointeur vers toutes les unités actives. J'essaye de créer un itérateur qui passera par chaque unité et passera à une autre fonction appelée can_attack (unité & u, Unité & v) qui prend deux unités et mesure si elles sont assez proches l'une de l'autre pour attaquer.Passage de l'itérateur dans la fonction

Lors de la compilation j'obtiens l'erreur suivante "erreur: la référence au type 'const unit' n'a pas pu se lier à une lvalue de type 'Unit * const'". Je comprends que je passe dans le mauvais type de variable, mais je ne sais pas comment transformer l'itérateur en une unité const. Merci pour toute aide

void World::enemies_within_attack_range(const Unit &u, 
            vector<Unit*> &targets) const 
{ 
    targets.clear(); 
    vector<Unit*>::const_iterator it=units.begin(); 
    for(it;it!=units.end();it++){ 
    if((*it)->team != u.team){ 
     if(can_attack(u,(*it))){ 
      targets.push_back(*it); 
     } 
    } 
    } 

} 
+0

Vous pourriez vouloir 'can_attack (u, * (* it))'. – songyuanyao

+0

Une solution aussi simple. Je vous remercie. Une autre question rapide .. ma boucle for génère une erreur que le résultat d'expression est inutilisé .. Pourquoi serait-ce? le résultat de l'expression n'est-il pas utilisé dans la boucle for? – spaceinvaders101

+1

Qu'est-ce que * expression result *? Quelle partie est-ce dans le code que vous avez montré? – songyuanyao

Répondre

0

Le problème est en appel can_attack et le paramètre const Unité & u. L'appel doit être corrigé en tant que songyuanyao mentionné: can_attack (u, * (* it)). Mais ce n'est pas le seul problème. Il y a trois options:

  1. au lieu de l'unité const & u, u comme unité déclare & u;
  2. au lieu de can_attack (Unité & u, v Unité &), déclarer comme can_attack (const Unité & u, Unité & v) si possible;
  3. (c'est probablement la pire option) use call can_attack (const_cast < Unité &> (u), * (* it)).

Le choix est à vous.