2010-12-29 12 views
7

Sto esaminando del codice che ho scritto nel 2006 come undergrad. È una semplice libreria di algoritmi genetici scritta in C++ usando i modelli. Funzionava nel 2006 quando l'ho codificato con Visual Studio, ma ora quando cerco di eseguirlo in xcode ottengo degli errori di compilazione.Modello C++ Errore Iterator

Questa funzione mi sta dando errori:

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 lamenta queste due linee non avere; prima di it_t1 e it_t2.

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

È perché il tipo di vettore è T?

ho dichiarato nella classe come segue:

template <typename T> 
class TSPGenome : public Genome 
{ 

Qualsiasi aiuto sarebbe apprezzato.

Grazie!

+3

Questo è un duplicato di questa voce di domande frequenti: [Dove inserire il "modello" e "nome tipo" sui nomi dipendenti] (http://stackoverflow.com/questions/610245/where-to-put-the-template -e-typename-on-dependent-names) – sbi

+2

No, non lo è. Le domande sono diverse - la risposta è la stessa. Qualcuno che non conosce già la risposta alla domanda non indovina la rilevanza di questa voce delle FAQ. Il collegamento alle domande frequenti è fantastico, ma affermare che questa domanda è un "duplicato" è ridicolo. – jalf

+0

Non correlato al tuo problema, ma non potresti semplicemente farlo: return (t1.genome_vec-> size() == t2.genome_vec-> size()) && std :: equal (t1.genome_vec-> begin() , t1.genome_vec-> end(), t2.genome_vec-> begin()); –

risposta

17

Usa typename quando la dichiarazione di variabili la cui classe è un membro di un tipo di modello-dipendente:

typename vector<T>::iterator it_t1; 

Una buona descrizione della necessità per la parola chiave typename può essere trovato alla A Description of the C++ typename Keyword.

+0

sapevo che era qualcosa di semplice. Grazie! – gprime