2010-12-29 14 views
7

저는 2006 년에 학부생으로 쓴 몇 가지 코드를 검토 할 것입니다. 템플릿을 사용하여 C++로 작성된 간단한 유전자 알고리즘 라이브러리입니다. 그것은 시각 스튜디오와 함께 코딩 때 2006 년에 일하는 데 사용하지만, 지금은 xcode에서 그것을 실행하려고하면 컴파일 오류가 발생합니다.C++ 템플릿 반복자 오류

이 기능은 나에게주고 오류 :

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; 
} 

엑스 코드는이 두 라인은 가지고 있지 뿌려; it_t1과 it_t2 전에.

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

벡터 유형은 T입니까?

template <typename T> 
class TSPGenome : public Genome 
{ 

어떤 도움을 주시면 감사하겠습니다 다음과 같이

나는 클래스에 선언했다.

감사합니다.

+3

다음은이 FAQ 항목의 속임수입니다. [종속 이름에 "템플릿"및 "typename"을두기위한 위치] (http://stackoverflow.com/questions/610245/where-to-put-the-template 종속 이름 기반 종속 이름) – sbi

+2

아니요. 질문은 다릅니다 - 대답은 같습니다. 질문에 대한 답을 이미 모르는 사람은 FAQ 항목의 관련성을 추측하지 못합니다. FAQ에 링크하는 것은 좋지만이 질문은 "중복"이라고 주장하는 것은 터무니 없습니다. – jalf

+0

문제와 관련이 없지만 다음과 같이하면 안됩니다 : return (t1.genome_vec-> size() == t2.genome_vec-> size()) && std :: equal (t1.genome_vec-> begin() , t1.genome_vec-> end(), t2.genome_vec-> begin()); –

답변

17

사용 typename 클래스 템플릿에 의존하는 유형의 멤버 변수를 선언 :

typename vector<T>::iterator it_t1; 

typename 키워드에 대한 필요성의 좋은 설명은 A Description of the C++ typename Keyword에서 찾을 수 있습니다.

+0

나는 그것이 단순한 무엇인가 알고 있었다. 감사! – gprime