更新的解决方案:
对于我的特殊问题,排序调用位于标记为 const 的 Render 函数中。通过删除 const (不是我的偏好)或将排序放在另一个函数中(在本例中,我的更新的底部),问题得到了解决。正如几个回答者所建议的那样,这是一个 const 问题,只是不是我在寻找的地方!
原始问题
我有一个指向这样声明的对象的指针的 std::vector 列表:
std::vector<Object*> myObjects;
我正在尝试通过 getter 按成员数据对它们进行排序......我也有一个排序谓词。这是排序谓词,后跟 std::sort 调用:
bool SortByDistance(const Object* o1, const Object* o2)
{
return o1->GetDist() < o2->GetDist();
}
排序调用:
std::sort(myObjects.begin(), myObjects.end(), SortByDistance);
尽管抱怨分配了只读位置或类似内容,但我遇到了十几个错误:
/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); 当然,错误会消失。