ゲーム エンジンのコードを C++ で Mac から Windows に移植すると、次のランタイム エラーが発生します:「Vector erase outside range」。マックで動く!
void Entity::runDeferreds() {
for (auto it = deferreds.begin(); it != deferreds.end(); /* nothing */ ) {
if (it->Condition()) {
it->Execution();
it = deferreds.erase(it);
} else {
++it;
}
}
}
std::vector<DeferredCall>
これは、呼び出された に格納されている「遅延」タスクのリストを反復処理しdeferreds
ます。DeferredCall
がCondition()
満たされている場合はExecution()
、実行され、 から削除する必要がありvector
ます。ただし、代わりに、前述のエラーが発生します。
DeferredCall は次のようになりますが、それほど重要ではありません。
struct DeferredCall {
std::function<bool()> Condition;
std::function<void()> Execution;
};
ヘルプ?!
編集:-代替方法
私もこれを試しましたが、再びMacで作業しています:
deferreds.erase(std::remove_if(deferreds.begin(), deferreds.end(),
[](DeferredCall &call) {
if (call.Condition()) {
call.Execution();
return true;
}
return false;
}
), deferreds.end());
ただし、この場合、「ベクトル反復子に互換性がありません」と表示されます。