2010-12-29 5 views
7

Je passe en revue un code que j'ai écrit en 2006 en tant qu'étudiant de premier cycle. C'est une bibliothèque d'algorithme génétique simple écrite en C++ en utilisant des templates. Il a l'habitude de travailler en 2006 quand je l'ai codé avec le studio visuel, mais maintenant quand j'essaye de l'exécuter dans xcode je compile des erreurs.C++ Template Erreur Iterator

Cette fonction me donne des erreurs:

friend bool operator==(const TSPGenome<T> & t1, const TSPGenome<T> & t2) 
{ 
    // loop through each interator and check to see if the two genomes have the same values 
    if(t1.genome_vec->size() != t2.genome_vec->size()) 
     return false; 
    else 
    { 
     // iterate through each 
     vector<T>::iterator it_t1; 
     vector<T>::iterator it_t2; 
     it_t1 = t1.genome_vec->begin(); 
     for(it_t2 = t2.genome_vec->begin(); 
      it_t2 != t2.genome_vec->end(); 
      ++it_t2, ++it_t1) 
     { 
      if(*it_t2 != *it_t1) 
       return false; 
     } 
    } 
    // everything seems good 
    return true; 
} 

Xcode se plaint de ces deux lignes ne pas avoir; avant it_t1 et it_t2.

vector<T>::iterator it_t1; 
vector<T>::iterator it_t2; 

Est-ce parce que le vecteur le t-il?

je l'ai déclaré dans la classe comme suit:

template <typename T> 
class TSPGenome : public Genome 
{ 

Toute aide serait appréciée.

Merci!

+3

Ceci est une dupe de cette entrée de la FAQ: [Où mettre le "template" et "typename" sur les noms dépendants] (http://stackoverflow.com/questions/610245/where-to-put-the-template -and-typename-on-dependent-names) – sbi

+2

Non, ce n'est pas le cas. Les questions sont différentes - la réponse est la même. Quelqu'un qui ne connaît pas déjà la réponse à la question ne devinera pas la pertinence de cette entrée FAQ. Lien vers la FAQ est super, mais prétendre que cette question est un "doublon" est ridicule. – jalf

+0

Pas lié à votre problème, mais ne pourriez-vous pas faire: return (t1.genome_vec-> size() == t2.genome_vec-> taille()) && std :: equal (t1.genome_vec-> begin() , t1.genome_vec-> end(), t2.genome_vec-> begin()); –

Répondre

17

Utilisation typename lors de la déclaration des variables dont la classe est membre d'un type dépendant du modèle:

typename vector<T>::iterator it_t1; 

Une bonne description de la nécessité pour le mot-clé typename se trouve à A Description of the C++ typename Keyword.

+0

Je savais que c'était quelque chose de simple. Merci! – gprime