更新的解决方案:
由于我的特殊问题,sort调用是在标记为const的Render函数内。通过删除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); 当然,错误会消失。
答案 0 :(得分:2)
仅从您的代码中,我猜您的Object::GetDist()
方法不是const
。在C ++中,const
的{{1}}对象只能调用class
个成员。
如果是这种情况,那么您有两种方法可以删除此错误。
(1)将const
设为GetDist
:
const
(2)更改class Object {
int GetDist () const; // <-- add const
};
:
SortByDistance