Я хочу попросить вас о подсказке, так как я новичок и не нашел подходящего ответа в интернете.
Я получаю эту ошибку:
ошибка отладки — итератор сопоставления / набора не может быть разыменован
на линии, которая выглядит так:
pointA = active->pointNext(timeNext);
с функцией pointNext () как я вижу все ок и что касается активный, Я имею:
active = setS.data.end();
Еще немного информации:
активный является мультимножеством< classA, classB :: classC> :: const_iterator
наборы имеет: setS.Q, setS.W, setS.T а также setS.data,
согласно которому setS.data имеет внутри 0 в квадратных скобках.
Когда у меня есть декларация итератора мультимножества в файле .cpp, во время отладки я не могу войти, чтобы увидеть, что находится внутри активного, когда это находится в файле .h, я могу.
Имея в .cpp я не могу войти активный, поэтому можно представить, что указатель (итератор) не может разыменоваться, потому что внутри он неправильный. Что если оно пустое, т.е. если setS.data пустой? или если внутри есть какой-то мусор?
Я знаю, что раньше эта штука работала под Linux, есть ли какая-то особенность, которую я должен изменить для запуска на windows? Например, чтобы изменить количество параметров шаблона только на один? (правильно приписать setS.data в активный, потому что я не уверен — правильно ли я это делаю?
Извините за этот довольно хаотичный пост, я хотел добавить свои догадки, чтобы кто-то пренебрег им, если они ошибаются. Если что-то здесь неясно или не хватает какой-либо информации, я с удовольствием добавлю это.
Подскажите, пожалуйста, по каким причинам я могу получить ошибку разыменования и где ее искать? Потому что я застрял и не знаю, как поступить.
любая помощь очень ценится, спасибо!
Проще говоря, так как active
указывает на контейнер end()
Вы не можете разыменовать его.
Я знаю, что вещь работала под Linux ранее
Если код был именно таким и был «запущен», все это означает, что ошибка никогда не проявлялась так, как вы заметили.
Это ваша проблема:
active = setS.data.end();
Это возвращает итератор к одному переданному концу контейнера.
Таким образом, элемент, на который он указывает, недействителен. Вы не можете вызывать какие-либо методы для объекта, на который ссылается итератор.
Если вы сделали:
active = setS.data.end();
if (setS.data.begin() != active)
{
// make sure the set is not empty first
--active;
active->methodCall(); // This would be OK
}
Вы не можете разыменовать итератор, возвращаемый стандартной библиотекой end()
функция, так как это «один за последним элементом». Обычно вы выполняете итерацию по допустимому диапазону, т.е. до ты достигаешь end()
:
for(someIteratorType it = setS.data.begin(); it != setS.data.end(); ++it)
{
it->someMethod();
}
Или в C ++ 11,
for (const auto& elem : setS.data)
{
elem.someMethod();
}
end () указывает на элемент после последнего элемента. поэтому end () не разыменовывается.
Вам нужно добавить проверку, чтобы увидеть, если вы в конце, и если вы, не разыменовывать его.
pointA = active->pointNext(timeNext);
пытается разыменовать «active» для вызова оператора -> (…), но active равен setS.data.end ();
end () возвращает итератор для элемента после конец контейнера. Поэтому вы не можете разыменовать это.