I am working on my C++ home-project and got into trouble with the following C2676 error:
binary '==': 'std::reference_wrapper<Interactable>' does not define this operator or a conversion to a type acceptable to the predefined operator
I have this in my World class and I am pretty sure the find is what invokes the above error:
void RemoveObject(Interactable* object)
{
if (!object) return;
auto itr = std::find(dynamicWorldObjects.begin(), dynamicWorldObjects.end(), *object);
if (itr == dynamicWorldObjects.end()) return;
dynamicWorldObjects.erase(itr);
}
And my Interactable looks like this:
class Interactable
{
public:
Vector2 Position;
Vector2 Velocity;
Shape Shape;
Interactable(const std::string& path, SDL_Renderer* rend, int id)
{
_id = id;
SDL_Surface* surface = IMG_Load(path.c_str());
_texture = SDL_CreateTextureFromSurface(rend, surface);
_destination.w = surface->w;
_destination.h = surface->h;
SDL_FreeSurface(surface);
}
~Interactable()
{
SDL_DestroyTexture(_texture);
}
void Render(SDL_Renderer* rend)
{
_destination.x = Position.X;
_destination.y = Position.Y;
SDL_RenderCopy(rend, _texture, NULL, &_destination);
}
int GetID() const
{
return _id;
}
bool operator == (const Interactable& A) const
{
return this->GetID() == A.GetID();
}
private:
SDL_Rect _destination;
SDL_Texture* _texture;
int _id;
};
My question is how am I able to resolve the comparison of these reference_wrappers? Am I missing something or my approach went wrong?
Thank you for the input!
Edit1: My World class starts with this:
class World
{
private:
std::vector<std::reference_wrapper<Interactable> > staticWorldObjects;
std::vector<std::reference_wrapper<Interactable> > dynamicWorldObjects;
int _id;
public:
World()
{
staticWorldObjects = std::vector<std::reference_wrapper<Interactable> >();
dynamicWorldObjects = std::vector<std::reference_wrapper<Interactable> >();
_id = 0;
}
...
}```
Not totally sure about
std::reference_wrapperbut maybe this will help.The first change needed is this
dynamicWorldObjectsis a vector ofInteractablebutobject(despite it's name) is a pointer, therefore you need*object. Or you could changeRemoveObjectso that it takes a reference instead of a pointer. Perhaps this is the better change.The second change concerns the const-correctness of
Interactable. This change might not be strictly necessary to resolve the current problem but it will bite you sooner or later, so it should be fixed now.Change
to
and
to