2013-03-04 5 views
1

왜 이것이 C++에서 작동하지 않습니까?
foo의 매개 변수를 std::vector<T>::iterator으로 제한 할 수없는 이유는 무엇이며 가장 좋은 해결 방법은 무엇입니까?왜 반복자 유형 공제가 실패합니까?

#include <vector> 

template<class T> 
void foo(typename std::vector<T>::iterator) { } 

int main() 
{ 
    std::vector<int> v; 
    foo(v.end()); 
} 

오류 :

In function ‘int main()’: 
    error: no matching function for call to ‘foo(std::vector<int>::iterator)’ 
    note: candidate is: 
    note: template<class T> void foo(typename std::vector<T>::iterator) 
    note: template argument deduction/substitution failed: 
    note: couldn’t deduce template parameter ‘T’ 
+0

템플릿 매개 변수를 추론 할 수없는 경우 일반적인 해결 방법이 있습니다. 명시 적으로 다음과 같이 지정하십시오.'foo (v.end());' –

답변

5

sandard이 T 여기에 비 추론 문맥에 있음을 말한다 때문에 작동하지 않는 주된 이유입니다. 컨텍스트가 추론되지 않는 이유는 어떤 유형을 함수에 전달할 때 컴파일러가 가능한 모든 std::vector (이 특정 번역 단위에 존재하지 않는 유형 포함)을 초기화해야하기 때문입니다. 에는 해당 유형이 있습니다. 클래스 의 의미는 표준에서 정의하고 있기 때문에

물론, std::vector의 경우, 컴파일러는이 작품을 만들기 위해 마법을 포함 할 수 있습니다. 하지만 일반적으로 TemplateClass<T>::NestedType은 글자 그대로 에 typedef가 될 수 있으며 컴파일러가 할 수있는 것은 아무것도 없습니다.

2

간단한은.

struct X {}; 
template<> class std::vector<X> { 
    typedef std::vector<int>::iterator iterator; 
}; 

템플릿이 완료되었습니다. 컴파일러가 결과에서 인수를 추론하도록 요청하고 있습니다. 이는 일대일 대응이 아닌 가능성을 무시하고도 일반적인 경우 불가능합니다.

일반적으로 반복기 유형 자체를 템플릿 매개 변수로 사용합니다. 이 등 양단 큐, 순환 버퍼, 같은 다른 임의 접근 반복자를 허용