2013-04-23 89 views
0

我试图找出一个对象是否存在于一个指针向量中。stl_algo.h错误,比较指针

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' 
在​​

非常感谢。

编辑:

的完整代码

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()); 
} 
+1

确定这是罪魁祸首吗?错误信息是抱怨'operator *',但是在这段代码中没有'operator *'的用法。 – 2013-04-23 21:36:25

+0

另外,'i'和'std :: vector :: size()'之间的有符号/无符号不匹配。 – 2013-04-23 21:37:10

+0

我刚刚编译了这段代码(加上三行'#include ','使用std :: vector;','struct Objectoid;'在顶部),唯一抱怨我从编译器得到的是signed/unsigned mismatch 。 – zwol 2013-04-23 21:37:44

回答

1

首先,评论:您现在已经提供了一些我们可以编译的东西,这很有帮助。这就是说,你提出的一堆代码不是问题的一部分(例如你的构造函数),而且我们实际上不能编译你所提供的代码(Vec2i没有定义)。

其次,回答您的问题:锵提供了以下错误:

/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()); 

那么一切编译。我提供的编译版本,因为std :: remove的第三个参数需要是你迭代的任何东西的value_type。您最初提供了一个Objectoid,但我们需要它是您的容器的value_type,这是一个Objectoid *


而只是为了扩大在第一个音符,一个好简单的问题陈述的原因,可能包括代码如下所示。它非常小,问题仍然很明显。任何遇到此问题的人都可以很快得到帮助。

#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()); 
} 
+0

附录:这里没有足够的代码可以肯定地知道,但是很有可能*你使用'vector '是一种装载枪并等待在脚中射击你。如果一个'Cell'对象超过了它持有非托管指针的'Objectoid',那么枪就会熄灭。你可能想仔细看看'std :: shared_ptr'。 – zwol 2013-04-23 22:00:24

+0

谢谢,我会记下来的。 – jossgray 2013-04-23 22:01:29

+0

@jossgray:为了试图澄清我的语气,我并不意味着任何这个意思。这只是为了帮助您快速解决问题。话虽如此,我发现当我遇到问题时,准备产生错误的小型自包含代码通常帮助我解决问题(并且更充分地理解编译器告知我们的诊断)。 – 2013-04-23 22:03:17

0

你的问题是没有意义的,因为编译器抱怨operator*,然而没有任何的使用在你的例子。

在此同时,你应该使用STL算法和重写你的contains为:

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

它完全避免了这个问题。