ОБНОВЛЕННОЕ РЕШЕНИЕ:
При моей конкретной проблеме вызов сортировки находился внутри функции Render, помеченной как const.Удаляя const (не мои предпочтения) или помещая сортировку в другую функцию (в нашем случае это нижняя часть моего Обновления), проблема решается.Как предложили несколько респондентов, это была постоянная проблема, но не там, где я искал!
ОРИГИНАЛЬНАЯ ПРОБЛЕМА
У меня есть список std :: vectorуказатели на объекты, объявленные таким образом:
std::vector<Object*> myObjects;
Я пытаюсь отсортировать их по элементам данных через геттер ... У меня также есть предикат сортировки.Вот предикат сортировки, за которым следует вызов std :: sort:
bool SortByDistance(const Object* o1, const Object* o2)
{
return o1->GetDist() < o2->GetDist();
}
Вызов сортировки:
std::sort(myObjects.begin(), myObjects.end(), SortByDistance);
Я получаю дюжину или около того ошибок, хотя и жалуюсь на назначение read-только местоположение или подобное:
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/include/c++/4.2.1/bits/stl_algo.h:2385: error: assignment of read-only location
Я уверен, что я делаю что-то глупое ... может кто-нибудь помочь пролить свет?Я ржавый с моим C ++ и просто возвращаюсь к нему!Любые предложения будут высоко оценены.
ОБНОВЛЕНИЕ
Я все еще получаю ту же ошибку, несмотря на попытки предложения iammilind полностью удалить const или убедиться, что const равен 100% (другими словами, я попытался добавить const в конец предиката SortByDistance, а также полностью удалить его из ситуации.
Я думаю, что один из комментариев может быть связан с чем-то по предложениюЯ делаю что-то глупое и опасное: хранение необработанных указателей на объекты в контейнерах STL. Хотя я никогда не делал это иначе: каковы причины хранения объектов в контейнерах, которые динамически не выделяются в куче?если я не имею дело с необработанными указателями, большая часть моей проблемы с сортировкой исчезнет.
В настоящее время я создаю свои объекты следующим образом:
std::vector<Object*> myObjects;
Object* tempObject = new Object;
myObjects.push_back(tempObject);
Я, конечно,освободить эту память, когда программа завершит работу, но звучит так, будто это вообще плохая идея?
На более надежномПримечание (к вопросу, который я задал), вот код в stl_algo.h, который жалуется:
template<typename _RandomAccessIterator, typename _Compare>
void
__insertion_sort(_RandomAccessIterator __first,
_RandomAccessIterator __last, _Compare __comp)
{
if (__first == __last) return;
for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
{
typename iterator_traits<_RandomAccessIterator>::value_type
__val = *__i;
if (__comp(__val, *__first))
{
std::copy_backward(__first, __i, __i + 1);
*__first = __val; // this line is the one complaining about read-only assignment
}
else
std::__unguarded_linear_insert(__i, __val, __comp);
}
}
Несмотря на то, что я пробовал различные решения const / no-const, я все еще получаю ту же ошибку.Если я закомментирую строку, в которой выполняется сортировка: std :: sort (myObjects.begin (), myObjects.end (), SortByDistance);ошибки, конечно, уходят.