2010-12-09 2 views
-5

if-case가 사실 인 이유는 무엇입니까?set가 비어있을 때 find가 end()와는 다른 결과를 반환하는 이유를 이해할 수 있도록 도와주세요.

typedef std::set< boost::shared_ptr<CCall>, HasFirstQueuedLongerTime> queued_container; 
    queued_container::iterator itTemp = queued.find(spCall); 
    queued_container::iterator itTempEnd = queued.end(); 
    if(itTemp != itTempEnd) //<-- is true 

queuedstd::set이며, spCall는 객체에 대한 공유 포인터입니다. queued이 비어 있기 때문에 찾기 함수는 queued.end() ...

와 동일한 반복기를 반환해야합니다. vs2005에서 Im 컴파일 및 디버깅. itTempitTempEnd이 같은 주소를 가리키고 있습니다.

모든 대답에 감사드립니다!

더 코드 정보는 다음 이전에 선언 된 경우 문 :

queued_container queuedCalls; 
const boost::shared_ptr<CCall> &spCall; //spCall is valid according to debug info. 


struct HasFirstQueuedLongerTime : std::binary_function < boost::shared_ptr<CCall>, boost::shared_ptr<CCall>, bool> { 
     bool operator() (const boost::shared_ptr<CCall>& lhs, const boost::shared_ptr<CCall>& rhs) const 
     { 
      return lhs->CreatedTime() < rhs->CreatedTime(); //returns true if lhs queued longer time than rhs 
     } 
    }; 

내 실제 실행 코드 :

queued_container::iterator itTemp = queued.find(spCall); 
queued_container::iterator itTempEnd = queued.end(); 

if(itTemp != itTempEnd) 
    AS_ERROR(1, "XXX", "ERROR: Already added to queue container."); 
queued.insert(spCall); 
CCallQueue::insert(spCall); 

시. 죄송합니다. 많은 수정 사항이 있습니다.

+1

제목이 매우 모호합니다. 나는'find'가 빈 세트에서 실패 할 것으로 기대합니다. 그러나 그것은 "반복자를 콜렉션의 끝으로 되돌려줍니다"에서 "실패"합니다. – MSalters

+3

@ user521048 : 실제 자체 테스트 케이스를 생성합니다. 위의 내용은 문제를 진단하기에 충분한 정보를 제공하지 않습니다. – wilx

+0

답변 해 주셔서 감사합니다. 이것에 대해 아는 것이 재미 있을지 말해주세요. – user521048

답변

1

문제가 해결되었습니다.

itTemp != itTempEnd 

은 사실이 아닙니다. AS_ERROR 아래의 함수는 다중 명령문이있는 "#define-function"이었습니다. 따라서 첫 번째 진술은 결코 실행되지 않았지만 두 번째 진술은 실행되지 않았습니다.

+0

그 이유는 당신이 어디에서 더 잘 할 수있는 정의를 사용해서는 안된다. – ybungalobill

관련 문제