2009-06-09 1 views
2

이 코드 조각은 VC6에서 파일을 컴파일하지만 VS 2008에서는 오류가 발생합니다. 아무도 그 이유를 말할 수 있습니까? NULL (NULL에 대한 typedef 인 포인터)을 더 이상 비교할 수 없다고 생각합니다. 그런 경우 VC9에서 어떻게 비교합니까?VC6에서 VS2008로 C++ 코드를 마이그레이션 한 후 오류 C2678 - 'type'유형의 왼쪽 피연산자를 사용하는 연산자가 없습니다.

for (std::vector<aCattrBase*>::iterator iT = attrLst.begin(); iT < attrLst.end(); iT++) 
     { 
      if ((iT != NULL) && (*iT != NULL)) //Error: C2678 
      { 
//code 
} 
} 

오류 C2678 : 이진 '! ='타입 의 왼쪽 피연산자 소요 찾지 연산자 'STD는 :: _ Vector_iterator < _Ty는 _Alloc는>' (또는 전혀 없다 허용되는 변환)

답변

8

'std :: vector :: iterator'의 형식이 반드시 포인터 유형일 필요는 없으므로 NULL과 비교할 수 없습니다.

이전 컴파일러에서는 포인터 일 뿐이므로 코드가 컴파일되었습니다. 하지만 코드가 다른 컴파일러로 옮겨 졌을 때와 같이 운이 좋았습니다.

iterator에 대한 유일한 테스트는 end() 또는 begin() 또는 begin() -> end() 범위 내의 유효한 반복자와 비교하는 것입니다. 이것은 벡터이므로 iterator로 수학 연산을 수행 할 수 있습니다. iT-begin()은 오프셋을 제공해야합니다. 그러나 이것은 모든 컨테이너에 유효하지 않습니다 (각 컨테이너 문서를 확인하십시오). 이 클래스의 인스턴스의 바이너리 연산자가없는 = NULL과 비교하기 위해,

for (std::vector<aCattrBase*>::iterator iT = attrLst.begin(); 
     iT != attrLst.end(); // Changed this. Notice the != 
     ++iT)     // Changed this. Prefer pre increment for not integer types 
{ 
    if (*iT != NULL) 
    { 
     //code 
    } 
} 
1

if 문의 첫 번째 조건에서 이터레이터를 NULL로 비교하려고합니다. iT의 반복자가 목록의 유효한 부분 내에 있어야하므로이 첫 번째 비교가 필요하지 않습니다.

+0

동의. 그러나 비교의 문제점은 무엇이며이 유형의 비교를위한 대안은 무엇입니까? – bobbyalex

+1

그것은 비교가 달성하려고하는 것에 따라 다릅니다. 가장 가까운 동등 물은 기본 생성 iterator입니다 (iterator가 포인터 인 경우 NULL이됩니다). – jalf

2

반복자 포인터되지 않습니다 :!

당신이 할 필요가에서 반복자 점은 무엇 테스트입니다.

0

반복기를 NULL과 비교하는 것은 결코 합법적 인 방법이 아닙니다. VC6는 당신이 그렇게하도록 시켰지만 그렇게하는 것은 잘못되었습니다.

예제에서는 반복자가 항상 무언가를 가리 키므로 비교는 의미가 없습니다. (* IT)! = NULL을 확인하는 것은 합리적이며 여전히 작동합니다.

반복자는 유효한 개체를 가리 키지 않는 진정한 가능성이있는 경우, VC9는 문서화되지 않은 기능이 true가됩니다

IT._Has_container() 
이있는 경우 반복자 포인트 반복자가하는 경우 컨테이너과 거짓 아니.

IT = std::vector<aCattrBase*>::iterator(); 

위가 아닌 휴대용 코드와 매우 가난한 스타일을 대표하고 나는 그것을 사용하는 것을 디자인하지 않는 것이 좋습니다 : 아무것도 반복자를 설정하려면, 당신은 빈 상태 (empty)의 반복자를 할당합니다. 그러나 VC9에서 컴파일 할 VC6 코드를 빨리 얻어야하는 경우 문제가 발생할 수 있습니다.