更新されたソリューション:
私の特定の問題では、sort呼び出しはconstとしてマークされたRender関数内にありました。const(私の好みではない)を削除するか、ソートを別の関数(この場合は私のUpdateの下部)に置くことで、問題は解決されます。いくつかの回答者が示唆したように、それは私が探していた場所ではなく、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);
読み取り専用の場所の割り当てなどについて不平を言っていますが、12個ほどのエラーが発生します。
/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++に錆びていて、それに戻ってきました!任意の提案をいただければ幸いです。
アップデート
constを完全に削除するか、constが100%であることを確認するという、iammilindの提案を試しても、同じエラーが発生します(つまり、SortByDistance述語の最後にconstを追加し、からconstを削除しようとしました。状況全体。
コメント投稿者の1人が、私が愚かで危険なことをしているという提案によって、何かに興味を持っているのではないかと思っています。オブジェクトへの生のポインターを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); もちろん、エラーはなくなります。