Genellikle bir std :: find yaptığımda üçüncü argüman olarak bir yüklemeyi koyacağım, ama bu sefer farklı bir şekilde yapacağımı düşündüm. Neden işe yaramadığını anlamak.Neden bu std :: bu nesneleri karşılaştırılamıyor
#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
}
ikili "==" hayır operatör tip RenderJob bir solak işlenen alan (veya kabul edilebilir dönüştürme yoktur) cevapları için
Düzenleme :: Kuyu sayesinde hangi bulundu . o bir örnek olarak
RenderJob foo;
RenderJob foo2;
foo == foo2; // Works
std::vector<RenderJob> renderJobs;
std::vector<RenderJob>::const_iterator constit = renderJobs.begin();
*constit == foo2; // Doesn't work
Hatta daha basit başarısız nedeni işte bazı örnekler:
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.
o tersi olsaydı:
foo2 == *pToRenderJob; // This would fail because the
// operator==(RenderJob&) the actual argument
// is not const. Very subtle rules
Örneklerinizde, '* = = foo2' veya' * pToRenderJob == foo2' işlevini yapamazsınız, çünkü '= =' '' const' sol işleneninin '* bu 'olmasını sağlamak için bildirilmez. . Eğer sınıf bir fonksiyona sahip olsaydı, aynı şey olurdu: “f()” - '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' yapamazsınız. Ama eğer bu işlevi 'void f() const' 'olarak değiştirirseniz, her ikisi de iyi olur. – aschepler
Teşekkürler, birçok kural yavaşça ayarlanıyor. – Zebrafish
Ayrıca sınıfınızda "renderJob_ID" öğesini tanımlamanız gerekir: int renderJob_ID {} '. Başlatılmamış nesnenin terk edilmesi, erken optimizasyondur. Örneğinizde foo.renderJob_ID ve foo.renderJob_ID * * belirsiz değer * var ve std :: vector renderJobs (10) 'ifadesini 10' renderJobs' şeklinde tanımlamak isterseniz, bu 10 nesnenin kendi renderJob_ID'si * belirsiz değer *. Bu nedenle kodunuz, operatöre == argümanı ekledikten sonra bile çalışmaya devam etmeyecektir. –
Oliv