Habituellement quand je fais un std :: find je mets un prédicat comme troisième argument, mais cette fois je pensais que je le ferais différemment, je ne le fais pas Je ne comprends pas pourquoi ça ne marche pas.Pourquoi std :: find ne peut-il pas comparer ces objets?
#include <iostream>
#include <vector>
#include <algorithm>
struct RenderJob
{
RenderJob() {};
int renderJob_ID;
bool operator==(RenderJob& rhs) { return rhs.renderJob_ID == this->renderJob_ID; }
};
int main()
{
RenderJob foo;
RenderJob foo2;
foo == foo2; // Works
std::vector<RenderJob> renderJobs;
std::find(renderJobs.begin(), renderJobs.end(), foo); // Doesn't work
}
binaire "==" aucun opérateur trouvé qui prend un opérande à gauche de de type RenderJob (ou il n'y a pas de conversion acceptable)
:: Modifier Eh bien merci pour les réponses . Voici quelques exemples des raisons pour lesquelles il ne
RenderJob foo;
RenderJob foo2;
foo == foo2; // Works
std::vector<RenderJob> renderJobs;
std::vector<RenderJob>::const_iterator constit = renderJobs.begin();
*constit == foo2; // Doesn't work
Encore plus simple à titre d'illustration:
const RenderJob* pToRenderJob;
*pToRenderJob == foo2; // This fails because the pointed to
// object is const, and cannot call the
// operator== function because the actual function
// definition is not const.
Si elle était l'inverse:
foo2 == *pToRenderJob; // This would fail because the
// operator==(RenderJob&) the actual argument
// is not const. Very subtle rules
Dans vos exemples, vous ne pouvez pas faire '* constit == foo2' ou' * pToRenderJob == foo2' car l'opérateur '==' n'est pas déclaré pour permettre à un opérande 'const' gauche de devenir' * this' . Ce serait la même chose si la classe avait une fonction 'void f();' - vous ne pourriez pas faire 'constit-> f()' ou 'pToRenderJob-> f()'. Mais si vous changez cette fonction en 'void f() const;', les deux seraient bien. – aschepler
Merci, les nombreuses règles se mettent en place lentement. – Zebrafish
Vous devez également définir 'renderJob_ID' dans votre classe:' int renderJob_ID {} '. Laisser un objet non initialisé est une optimisation prématurée. Dans votre exemple, foo.renderJob_ID et foo.renderJob_ID ont * une valeur indéterminée * et si vous déclarez 'std :: vector renderJobs (10)' pour créer un vecteur de 10 'renderJobs', tous ces 10 objets auront leur renderJob_ID contenant un * valeur indéterminée *. Donc, votre code continuera à ne pas fonctionner, même après avoir ajouté const à l'opérateur == argument. –
Oliv