오류 C2678 C ++ 코드를 VC6에서 VS2008로 마이그레이션 한 후 - 'Type'유형의 왼쪽 오페라를 사용하는 연산자가 없습니다.

StackOverflow https://stackoverflow.com/questions/968602

문제

이 코드는 VC6에서 파일을 컴파일하지만 2008 년 vs에서는 오류가 발생합니다. 누구든지 이유를 말해 줄 수 있습니까? 더 이상 포인터를 NULL과 비교할 수 없기 때문입니다 (0의 typedef). 이 경우 VC9 에서이 비교를 어떻게 수행합니까?

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

오류 C2678 : Binary '! =': 'std :: _ vector_iterator <_ty, _alloc>'유형의 왼쪽 오페라를 사용하는 연산자가 없습니다.

도움이 되었습니까?

해결책

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

이전 컴파일러에서는 포인터가되었으므로 코드가 컴파일되었습니다. 그러나 방금 운이 좋았습니다 (코드를 다른 컴파일러로 옮겼을 때 보여 주듯이).

당신이 가진 반복자에 대한 유일한 테스트는 그것을 end () 또는 begin () 또는 범위 내에서 유효한 반복기를 begin () -> end ()와 비교하는 것입니다. 이것은 벡터이므로 반복자로 수학적 연산을 수행 할 수 있습니다. it-begin ()은 당신에게 오프셋을 제공해야합니다. 그러나 이것은 모든 컨테이너에 유효하지 않습니다 (각 컨테이너 문서를 확인하십시오).

반복자가 가리키는 것을 테스트하기 만하면됩니다.

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
    }
}

다른 팁

반복자는 포인터가 아니며 클래스 인스턴스이며 이진 연산자가 없습니다! = NULL과 비교합니다.

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

반복자를 NULL과 비교하는 것은 결코 합법적이지 않았습니다. VC6은 당신이 그것을 할 수 있지만 그렇게하는 것은 잘못이었다.

당신이주는 예에서 반복자가 항상 무언가를 가리키기 때문에 비교는 의미가 없습니다. checking (*it)! = null은 합리적이며 여전히 작동합니다.

반복자가 유효한 개체를 가리키지 않는다는 실제 전망이있는 경우 VC9는 문서화되지 않은 기능을 갖습니다.

IT._Has_container()

반복자가 컨테이너를 가리키고 반복자가 그렇지 않은 경우 False가 있으면 그렇습니다. 반복자를 아무것도하지 않도록하려면 빈 반복자를 할당합니다.

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

위의 것은 포트가 불가능한 코드와 상당히 열악한 스타일을 나타내며 사용하기 위해 무엇이든 설계하는 것이 좋습니다. 그러나 VC9에서 컴파일하기 위해 VC6 코드를 빠르게 가져와야한다면 문제가 발생하지 않을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top