2012-02-28 4 views
1

저는 새로운 C++ 프로그래머입니다. 저는 전에 Java와 ANSI C를 배웠고 한 발을 내딛기로 결정했습니다.지도를 사용한 부분 클래스 템플릿 전문화

글쎄, 나는 C++를 사랑하지만 나는 반복자의 작동 방식을 좋아하지 않았다

자바에서, 당신은 전체 컨테이너가 비공개로하고, 반복자에 게터 기능을 구현할 수 있고, 반복자는 방법이있다 hasNext()은 컨테이너의 끝에 도달했는지에 따라 부울을 반환합니다.

내가 interator이 iteratorBegin()에 의해 반환 된 반복자를 증가하고 iteratorEnd()과 비교, 처음과 마지막 위치에 해당하는 반환이 게터, iteratorBegin()iteratorEnd()을 쓰고 ++ C에 비슷한 수행 발견하는 유일한 방법, 나에게 허용 최종 위치가

에 도달 될 때까지 용기를 반복하지만, 난 단지 ONE getter 메소드를 사용하려면, 내가 생각하기 : 나는 ', 너무 좋아 지금까지

"의 내 자신의 반복자 클래스를 만들자" 설정과 목록을 사용하여 성공적으로 수행했지만 맵으로 만들 수는 없습니다. 여기에 코드가 있습니다. 저를 roubling :

template<typename T, typename D> 
const D& custIterator<T,D>::next() 
{ 
    const D& obj = (*it); 
    if(hasNext()) 
    { 
     it++; 
    } 
    return obj; 
} 

//the above works fine 

template<typename T, typename D> 
const D& custIterator<map<T,D>,D>::next() //error in this line 
{ 
    D& obj = (*it).second; 
    if(hasNext()) 
    { 
     it++; 
    } 
    return obj; 
} 

전문 방법을 컴파일, 그것은 말한다 (클래스가 별도의 .H에 정의되어 있습니다, 이것은 customIterator.cpp라고 함) : 오류 : '매핑'이 범위 도 선언되지 않았습니다 내가 codeblocks 사용하여 파일

내가 GCC 버전 4.4.5을 사용하고 위에 (데비안 4.4.5-8)#include <map>을 추가하지만

, 나는 약간의 도움이 필요하십시오.

감사합니다.

+1

지도를 포함하여 std :: map을 사용합니다. 또는 custIterator ...과 같이 맵을 한정하면 트릭을 수행 할 수 있습니다. –

답변

5

모든 표준 컨테이너는 std 네임 스페이스 내에서, 당신은 내가 각 언어는 자신의 관용구를 가지고 있기 때문에 C++에 자바 숙어를 이월하는 것을 시도하고 혼합하지 않는 것이 좋습니다 것입니다 일반적으로 이렇게

std::map<T,D> 

그것을 자격을해야한다 (#define BEGIN {이 그다지 좋은 생각이 아니라고 생각하는 것처럼) 다른 프로그래머를 혼란스럽게 할 것입니다.

범위는으로 알려져 있으며 일부는 C++ 반복자보다 나은 해결책으로 간주되지만 언어로 나아갈 때까지 각 개발자가 자체적으로 발명하는 것은 위험하다고 생각합니다. 범위.

Further reading 또는 tl;dr slides (내가 볼 수없는 동영상이 있습니다.)

+0

+1 "각 언어마다 고유 한 숙어가 있기 때문에 Java 관용구를 C++로 옮기려고하지 않습니다."- 일반적으로 관용구가 좋은 이유가 있습니다. –

+0

부끄러운 실수, 고마워, 많이 작동했습니다. 이제 코드를 컴파일하는 데 어려움이 있으므로 템플릿 전문화에 대한 설명서를 다시 읽어야합니다. 도움 주셔서 감사합니다. –