2010-12-29 34 views
7

Repaso un código que escribí en 2006 como estudiante. Es una biblioteca de algoritmos genéticos simple escrita en C++ utilizando plantillas. Solía ​​funcionar en 2006 cuando lo codifiqué con Visual Studio, pero ahora, cuando intento ejecutarlo en xcode, obtengo errores de compilación.C++ Template Iterator error

Esta función me está dando errores:

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 queja de estas dos líneas no tener; antes de it_t1 y it_t2.

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

¿Es porque el vector mecanografía T?

lo declaré en la clase de la siguiente manera:

template <typename T> 
class TSPGenome : public Genome 
{ 

Cualquier ayuda sería muy apreciada.

Gracias!

+3

Este es un engaño de esta entrada de preguntas frecuentes: [Dónde colocar la "plantilla" y "nombre de tipo" en los nombres dependientes] (http://stackoverflow.com/questions/610245/where-to-put-the-template -and-typename-on-dependent-names) – sbi

+2

No, no lo es. Las preguntas son diferentes, la respuesta es la misma. Alguien que no conoce la respuesta a la pregunta no adivinará la relevancia de esa entrada de Preguntas Frecuentes. Vincular a las preguntas frecuentes es genial, pero afirmar que esta pregunta es un "duplicado" es ridículo. – jalf

+0

No está relacionado con su problema, pero no podría hacer lo siguiente: return (t1.genome_vec-> size() == t2.genome_vec-> size()) && std :: equal (t1.genome_vec-> begin() , t1.genome_vec-> end(), t2.genome_vec-> begin()); –

Respuesta

17

Uso typename al declarar variables cuya clase es un miembro de un tipo dependiente del molde:

typename vector<T>::iterator it_t1; 

Una buena descripción de la necesidad de que la palabra clave typename se puede encontrar en A Description of the C++ typename Keyword.

+0

sabía que era algo simple. ¡Gracias! – gprime