2017-01-04 3 views
1
#include <iostream> 
#include <string> 

int main() { 
    using std::string; 
    using std::distance; 
    using std::cout; 
    using std::endl; 

    string s("abc"); 
    string::const_iterator b = s.begin(); 
    string::const_iterator e = s.end(); // success 
    cout << distance(b, e) << endl; 
    cout << distance(b, static_cast<string::const_iterator>(s.end())) << endl; 
    cout << distance(b, s.end()) << endl; // error 
    return 0; 
} 

s.end() 문자열의 끝으로 estd::string::const_iterator-implicitly converted 될 수 함수 파라미터 실패하지만, 함수는 파라미터로서 전달 될 때, 명시 적으로 주조 될 수있다; 그렇지 않으면 컴파일 타임에 오류가 발생합니다. 왜 그런가요?암시 적 변환이

FYI, s.begin()s.end()은 모두 std::string::iterator을 반환하는 것으로 보입니다.

e가와 T2e 복사 초기화 할 수있는 경우에만, 즉 선언 T2 t = e; 경우 T2에 암시 적으로 변환이라고합니다

는 일부 임시 발명에 대해, (컴파일 할 수 있습니다) 잘 형성된다 t .

+0

감사합니다. 유효한 응답. 내 템플릿이 아닌 메소드를 사용하지 않는 것이 좋지 않습니다. –

답변

1

함수 반복자 CONST 비 CONST 중 각 기능 매개 변수에 사용할 수 있기 때문에

template <class InputIterator> 
typename iterator_traits<InputIterator>::difference_type 
distance(InputIterator first, InputIterator last); 

그래서 그것은 템플릿 파라미터의 타입을 추론 할 수없는 하나 개의 템플릿 파라미터 갖는다.

당신은 명시 적으로 템플릿 인수를 지정하여 다음과 같은 방법

std::distance<std::string::const_iterator>(b, s.end()) 

캐스팅없이 작성할 수 있습니다.

또 다른 예입니다. 당신이

long x = 0; 
int y = 0; 
std::min<long>(x, y); 

다음 코드는 컴파일 기록 할 경우,이 코드는

long x = 0; 
int y = 0; 
std::min(x, y); 

그러나 컴파일되지 않습니다.

1

템플릿 함수 인수가 변환되지 않습니다. std::distance의 두 인수는 동일한 유형이어야합니다.

관련 문제