Zwykle, kiedy robię std :: find, postawię predykat jako trzeci argument, ale tym razem pomyślałem, że zrobię to inaczej, nie wiem. t zrozumieć, dlaczego to nie działa.Dlaczego nie można tego std :: znaleźć porównaj te obiekty?
#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
}
binarny "==" żaden operator znalezione, które zajmuje leworęcznego operand typu RenderJob (lub nie ma akceptowalne konwersji)
Edit :: Dobrze dzięki za odpowiedzi . Oto kilka przykładów, dlaczego nie
RenderJob foo;
RenderJob foo2;
foo == foo2; // Works
std::vector<RenderJob> renderJobs;
std::vector<RenderJob>::const_iterator constit = renderJobs.begin();
*constit == foo2; // Doesn't work
jeszcze prostsze jako ilustracja:
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.
Gdyby było na odwrót:
foo2 == *pToRenderJob; // This would fail because the
// operator==(RenderJob&) the actual argument
// is not const. Very subtle rules
W twoich przykładów nie można zrobić '* Constit == foo2' lub' * pToRenderJob == foo2' ponieważ operator == '' nie jest zadeklarowana, aby umożliwić 'const' lewy argument stać' * this' . Byłoby tak samo, gdyby klasa miała funkcję 'void f();' - nie można było zrobić 'constit-> f()' lub 'pToRenderJob-> f()'. Ale jeśli zmienisz tę funkcję na "void f() const;", obie te rzeczy będą w porządku. – aschepler
Dzięki, że wiele zasad powoli ustawienie w – Zebrafish
Należy również definiuje 'renderJob_ID' wewnątrz swojej klasie.' Int renderJob_ID {} '. Pozostawienie niezainicjowanego obiektu to przedwczesna optymalizacja. W przykładzie foo.renderJob_ID i foo.renderJob_ID mieć wartość nieokreśloną * * a jeśli zadeklarować 'std :: vector renderJobs (10)' stworzyć wektor 10 'renderJobs', wszystko to 10 obiektów będzie miał ich renderJob_ID trzyma * nieokreślona wartość *. Twój kod nie będzie działał, nawet po dodaniu const do argumentu operator ==. –
Oliv