2008-11-12 16 views
2

방금 ​​Visual Studio 2003에서 2005로 프로젝트를 변환했습니다. 대부분 변환되었지만 다음 줄에서 일련의 STL 오류가 발생했습니다.STL 마이그레이션 문제 (VS 2003 -> 2005)

c:\<path>\Headerfile.h(20) : error C2440: 'default argument' : cannot convert from 'int' to 'std::_Vector_iterator<_Ty,_Alloc>' 
     with 
     [ 
      _Ty=CObject *, 
      _Alloc=std::allocator<CObject *> 
     ] 
     No constructor could take the source type, or constructor overload resolution was ambiguous 

내가 그 코드를 잘못 아무것도 볼 수 없습니다 그것은 VS 2003 어떤 아이디어에서 완벽하게 작동 다음과 같이

void SomeFn(std::vector<CSomeObject*>::iterator it, 
std::vector<CSomeObject*>::iterator itBegin = NULL, 
std::vector<CSomeObject*>::iterator itEnd = NULL); 

비주얼 스튜디오 오류가 무엇입니까?

+0

이상한, 기본값으로 NULL에 대해 불평하는 것으로 보인다. – kenny

+0

정확히 내가 생각하는 바를 - NULL을 주석으로 처리하면 프로그램이 더 이상 작동하지 않는다. – Konrad

답변

10

프로그램이 올바르지 않습니다. 이 반복자를 초기화 할 때 원하는 것을 실제로 모르겠습니다. 당신이 컨테이너에있을 여전히 "유효"로하지 guarantied 반복자를해야하는 경우 기본 - 생성자 사용할 수 있습니다, 그러나

typedef std::vector<CSomeObject*> myvector_t; 
void SomeFn(myvector_t::iterator it, 
      myvector_t::iterator itBegin = myvector_t::iterator(), 
      myvector_t::iterator itEnd = myvector_t::iterator()); 

주, 당신이 그렇게 할 경우, it, itBeginitEnd 의미있는 방식으로 비교 될 수 없습니다! 주어진 컨테이너에서 얻은 반복자 만이 의미있는 비교가 가능합니다. 결국 itBeginitEnd에 대한 기본값을 사용하지 않는 것이 좋습니다. 이들이 실제로 필요하지 않으면 인수없이 다른 함수를 만들고 의미있는 일을하십시오. 즉 :

프로그램의 또 다른 문제점은 벡터를 사용하여 포인터를 저장하는 것입니다. 이것은 실제로 안전하지 않습니다. 요소를 먼저 삭제하지 않고 벡터에서 요소를 지우지 마십시오. 객체를 복사하는 알고리즘에 문제가있을 수도 있습니다. 벡터에서 스마트 포인터를 사용하는 것이 좋습니다.

2

2003 년 std::vector<T>::iterator은 단지 T *입니다. 2005 년에 적어도 디버그 모드에서는 클래스이므로 해당 값으로 NULL (0으로 해결됨)에 NULL을 사용할 수 없습니다.

는 대신 기본-건설 반복자를 사용할 수 있습니다 : NULL이 반복자로 변환 할 수 없습니다로

std::vector<CSomeObject*>::iterator itBegin = std::vector<CSomeObject*>::iterator()