2010-12-29 15 views
7

Ich gehe über einige Code, den ich im Jahr 2006 als undergrad schrieb. Es ist eine einfache genetische Algorithmus-Bibliothek, die in C++ mit Hilfe von Templates geschrieben wurde. Es verwendet, um im Jahr 2006 zu arbeiten, wenn ich es mit Visual Studio codiert, aber jetzt, wenn ich versuche, es in xcode ausführen, bekomme ich Kompilierungsfehler.C++ Vorlage Iterator Fehler

Diese Funktion gibt mir Fehler:

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 beschwert sich über diese beiden Linien, die nicht; vor it_t1 und it_t2.

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

Ist es, weil der Vektortyp es T?

Ich erklärte es in der Klasse wie folgt:

template <typename T> 
class TSPGenome : public Genome 
{ 

Jede Hilfe würde geschätzt.

Danke!

+3

ist ein Betrogene dieser FAQ-Eintrag: [Wo setzen Sie die „Vorlage“ und „Typname“ auf abhängigen Namen] (http://stackoverflow.com/questions/610245/where-to-put-the-template -und-typname-auf-abhängige-name) – sbi

+2

Nein ist es nicht. Die Fragen sind anders - die Antwort ist die gleiche. Jemand, der die Antwort auf die Frage nicht bereits kennt, wird die Relevanz dieses FAQ-Eintrags nicht erraten. Die Verlinkung zu den FAQ ist großartig, aber die Behauptung, dass diese Frage ein "Duplikat" ist, ist lächerlich. – jalf

+0

nicht im Zusammenhang mit Ihrem Problem, konnte aber nicht einfach tun: return (t1.genome_vec-> size() == t2.genome_vec-> size()) && std :: gleich (t1.genome_vec-> begin() , t1.genome_vec-> end(), t2.genome_vec-> begin()); –

Antwort

17

Verwenden typename wenn Variablen, deren Klasse ist ein Mitglied eines Template-abhängigen Typs deklariert:

typename vector<T>::iterator it_t1; 

Eine gute Beschreibung der Notwendigkeit, dass das typename Schlüsselwort kann bei A Description of the C++ typename Keyword finden. Diese

+0

Ich wusste, dass es etwas Einfaches war. Vielen Dank! – gprime