Ваша программа неверна, так как NULL не может быть преобразован как итератор. Я действительно не знаю, что вы хотите, чтобы эти итераторы были инициализированы как. Если вам нужен итератор, который гарантированно не будет находиться в контейнере, а будет «действительным», вы можете использовать конструктор по умолчанию:
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
, itBegin
и itEnd
не будут сопоставимы по значимости! Только итераторы, полученные из данного контейнера, по смыслу сопоставимы. В конце я бы рекомендовал не использовать значения по умолчанию для itBegin
и itEnd
. Если вам действительно их не нужно, создайте другую функцию без аргументов и сделайте что-то значимое. i.e.:
typedef std::vector<CSomeObject*> myvector_t;
void SomeFn( myvector_t::iterator it,
myvector_t::iterator itBegin,
myvector_t::iterator itEnd );
void SomeFn( myvector_t::iterator it ); // No begin/end arguments
Другая проблема вашей программы - использование вектора для хранения указателей. Это действительно небезопасно. Убедитесь, что вы никогда не удаляете элементы из вектора, не удалив элемент первым. У вас также могут быть проблемы с алгоритмами копирования объектов. Лучше использовать умные указатели в векторах.