1

更新的解决方案:

对于我的特殊问题,排序调用位于标记为 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); 当然,错误会消失。

4

1 回答 1

2

仅从您的代码来看,我猜您的Object::GetDist()方法不是const. 在 C++ 中,a 的const对象class只能调用const成员。如果是这种情况,那么您有两种方法可以消除此错误。

(1) 制作GetDistconst

class Object {
  int GetDist () const;  // <-- add const
};

(2) 变化SortByDistance

bool SortByDistance (Object*, Object*); // <-- remove const
于 2011-06-08T02:55:58.573 回答