0

オブジェクトがポインターのベクトル内に存在するかどうかを調べようとしています。

vector<Objectoid*> elements;

bool contains(Objectoid &o){
    for(int i = 0; i < elements.size(); i++){
        if(elements[i] == &o){
            return true;
        }
    }
    return false;
}

しかし、これらのエラーが発生し、

no match for 'operator==' in '__first. __gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = Objectoid**, _Container = std::vector<Objectoid*, std::allocator<Objectoid*> >]() == __value'

stl_algo.h

大変助かりました。

編集:

完全なコード

class Cell : public Element{

public:
    Rectf cellRect;
    Vec2i size;
    Vec2i pos;
    vector<Objectoid*> elements;

    Cell(Vec2f &pos_, Vec2f &size_){
        pos = pos_;
        size = size_;
        Vec2f p2 = Vec2f(pos.x + size.x, pos.y + size.y);
        cellRect = Rectf(pos, p2);
    }

    void add(Objectoid &o){
        elements.push_back(&o);
    }
    void remove(Objectoid &o){
        elements.erase(std::remove(elements.begin(), elements.end(), o), elements.end());
    }

    bool contains(Objectoid &o){
        for(int i = 0; i < elements.size(); i++){
            if(elements[i] == &o){
                return true;
            }
        }
        return false;
    }

};

2D ゲームで衝突検出用のハッシュ テーブルを実装しようとしています。これは、テーブルの各セルのクラスです。

編集

つまり犯人は実は

void remove(Objectoid &o){
    elements.erase(std::remove(elements.begin(), elements.end(), o), elements.end());
}
4

2 に答える 2

1

まず、コメント:私たちがコンパイルできるものを提供してくださったことは役に立ちます。そうは言っても、あなたが提示した問題の一部ではないコードの山があり(コンストラクターなど)、提示したコードを実際にコンパイルすることはできません(Vec2i定義がありません)。

第二に、あなたの問題への答え: Clang は次のエラーを提供します:

/usr/include/c++/4.2.1/bits/stl_algo.h:208:17: error: invalid operands to binary expression ('Objectoid *' and 'const Objectoid')
      if (*__first == __val)

sa.cc:27:19: note: in instantiation of function template specialization 'std::remove<__gnu_cxx::__normal_iterator<Objectoid **, std::vector<Objectoid *, std::allocator<Objectoid *> > >, Objectoid>' requested here
      elements.erase(std::remove(elements.begin(), elements.end(), o), elements.end());

その行を次のように変更すると:

elements.erase(std::remove(elements.begin(), elements.end(), &o), elements.end());

その後、すべてがコンパイルされます。value_typestd::remove の 3 番目の引数は、繰り返し処理するものの である必要があるため、私が提供したバージョンはコンパイルされます。あなたは最初に を提供しましたが、コンテナの でObjectoidある必要があります。value_typeObjectoid *


そして、最初のメモを拡張するためだけに、単純化された適切な問題ステートメントには、次のようなコードを含めることができます。それは非常に小さく、問題はまだ明らかです。これに遭遇した人は誰でも、非常に迅速に助けることができます.

#include <vector>
#include <algorithm>

class Objectoid {};

int main() {
    std::vector<Objectoid *> elements;
    Objectoid o;

    elements.erase(std::remove(elements.begin(), elements.end(), o), elements.end());
}
于 2013-04-23T21:53:40.453 に答える
0

コンパイラが について不平を言っているため、あなたの質問は意味がありoperator*ませんが、あなたの例ではそれを使用していません。

それまでの間、STL アルゴリズムを使用して、次のように書き換える必要がありますcontains

bool contains(Objectoid &o) {
    return std::find(elements.cbegin(), elements.cend(), &o) != elements.cend();
}

問題を完全に回避します。

于 2013-04-23T21:39:35.123 に答える