通常、std :: findを実行すると、3番目の引数として述語を入れますが、今回は別の方法で行うと思っていました。それがうまくいかない理由を理解していない。なぜこのstd :: findはこれらのオブジェクトを比較できません
#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
}
答えを
編集::まあ「==」何のオペレータが 型RenderJobの左利きのオペランドを取ります(または、許容可能な変換はありません)が見つからないバイナリ感謝。ここでは、説明のようにさらに簡単
RenderJob foo;
RenderJob foo2;
foo == foo2; // Works
std::vector<RenderJob> renderJobs;
std::vector<RenderJob>::const_iterator constit = renderJobs.begin();
*constit == foo2; // Doesn't work
を失敗した理由のいくつかの例は以下のとおりです。
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.
それは他の方法で回避した場合:
foo2 == *pToRenderJob; // This would fail because the
// operator==(RenderJob&) the actual argument
// is not const. Very subtle rules
あなたの例では、 'operator =='が 'const'左オペランドを' * this'にすることを宣言していないので、 '*構成== foo2'や' * pToRenderJob == foo2'を実行することはできません。クラスに 'void f();'という関数があれば同じことになります - あなたは 'struct-> f()'や 'pToRenderJob-> f()'を実行できませんでした。しかし、その関数を 'void f()const;'に変更すれば、両方とも問題ありません。 – aschepler
ありがとう、たくさんのルールがゆっくりと設定されています。 – Zebrafish
あなたのクラスの中に 'renderJob_ID'を定義する必要があります:' int renderJob_ID {} '。初期化されていないオブジェクトを残すことは時期尚早の最適化です。あなたの例では、foo.renderJob_IDとfoo.renderJob_IDは* indeterminate value *を持ち、 'std :: vector renderJobs(10)'を宣言して10個の 'renderJobs'のベクトルを作成した場合、これらの10個のオブジェクトはすべてrenderJob_ID *不定値*。したがって、演算子==引き数にconstを追加した後でも、あなたのコードは引き続き動作しません。 –
Oliv