2013-06-10 2 views
1

나는이 함수를 선언하는 것을 시도하고있다 :C++ 템플릿과 반복자

template <typename T> void hi(std::map<T,double> m,std::vector<std::map<T,double>::iterator > vec) 
{ 
    //.... 
} 

내가지도이지도에 반복자의 벡터를 매개 변수로 함수가 갖고 싶어. 그러나 g의 ++ 컴파일러는 그것을 좋아하지 않는 것 나는 다음과 같은 오류가 나타납니다

type/value mismatch at argument 1 in template parameter list for ‘template<class _Tp,  class _Alloc> class std::vector’ 
: error: expected a type, got ‘std::map::iterator’ 
: error: template argument 2 is invalid 

어떤 도움하세요?

+0

당신은'typename'을 사용해야합니다. –

+0

이미 선언문에서 사용하고 있습니다 만, 아마도 다른 것을 의미합니다. – volatile

+2

BTW, 정말 큰 데이터 구조를 값으로 전달 하시겠습니까? – TemplateRex

답변

4

당신이해야 write typename before the iterator argument

template <typename T> 
void hi(std::map<T,double> m, std::vector<typename std::map<T,double>::iterator > vec) 
              ^^^^^^^^ 
{ 
    //.... 
} 

네, typename 2 다른 의미를 가지고 불행한 일이다. 일부 저자는 정확히 같은 이유로 template<class T>을 사용하여 템플릿 매개 변수 선언을 종속 형식 추출에서 시각적으로 모호하게합니다. 특히 템플리트 메타 프로그래밍에서 코드를 좀 더 읽기 쉽게 만들 수 있습니다.

+0

틀렸어. 여기에'typename'이 필요합니다 :'std :: vector :: iterator' – borisbn

+0

예,이 마지막 수정 작업을했습니다. 모두들 감사합니다 – volatile

+0

@borisbn 죄송합니다, 업데이트되었습니다. 당신이 옳았습니다. 너무 일찍 기록했습니다. 대답을 썼을 때 중첩 된'std :: map'은 화면을 떨어 뜨 렸습니다. 그래서'std :: vector : :: iterator' :-)를 보냈다고 생각했습니다. – TemplateRex