2010-12-09 1 views
-5

Почему if-case true ?!Помогите мне понять, почему find возвращает что-то другое, чем end() на std :: set, когда set пуст

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 

queued является пустой std::set и spCall является общим указателем на объект. Поскольку queued пуст, функция поиска должна возвращать итератору, равную queued.end() ...

Im компиляция и отладка на vs2005. Я вижу, что itTemp и itTempEnd указывает на тот же адрес.

Благодарен за ответы!

Подробнее код, следующий объявлен перед тем Условный оператор:

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); 

Ps. Извините за многие изменения ..

+1

Название довольно неоднозначное. Я бы ожидал, что `find` потерпит неудачу в пустых наборах. Но это «сбой», как в «возвращает итератор до конца коллекции». – MSalters 2010-12-09 15:28:23

+3

@ user521048: Создайте реальную автономную тестовую запись. Приведенное выше не дает достаточной информации для диагностики проблемы. – wilx 2010-12-09 15:29:25

ответ

1

Проблема решена!

itTemp != itTempEnd 

не соответствует действительности! Функция ниже AS_ERROR была «# define-function» с несколькими операторами. Поэтому первое утверждение никогда не исполнялось, а второе.