<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Fehlender &amp;quot;==&amp;quot; Operator Fehler, obwohl vorhanden]]></title><description><![CDATA[<p>Hi,</p>
<p>ich hab das Gefühl, dass mich C++ verarscht. Ich muss den &quot;==&quot; Operator meiner Klasse überladen, da ich ein vector damit fülle und std::find() ausführen will. Obwohl ich dies gemacht habe, beschwert sich der Kompiler über den fehlenden Operator. Das Beispiel Projekt, welches ziemlich ähnlich aufgebaut ist, lässt sich natürlich problemlos kompilieren und ausführen. Wie passt das zusammen, was mache ich falsch?</p>
<p>Hier der Header:</p>
<pre><code>#pragma once

//#include &quot;GraphicsContext.h&quot;

namespace gl
{
	class Buffer
	{
	protected:
		GraphicsContext&amp; context;
		void* data;
		bool locked;
	public:
		Buffer(GraphicsContext&amp; context, unsigned dataSize);
		virtual ~Buffer();

		void* Lock();
		void Unlock();

		bool Equal(const Buffer&amp; other) const;
		//bool operator ==(const Buffer&amp; op2) const;
	};

	bool operator==(const gl::Buffer&amp; lhs, const gl::Buffer&amp; rhs);
}
</code></pre>
<p>Hier die Methode welche std::find ausführt:</p>
<pre><code>void GraphicsContext::RegisterBuffer(Buffer&amp; buf)
	{
		auto iter = std::find&lt;std::vector&lt;Buffer*&gt;::iterator&gt;(buffers.begin(), buffers.end(), buf);
		if (iter != buffers.end())
			buffers.push_back(&amp;buf);
	}
</code></pre>
<p>Der Fehler:</p>
<pre><code>Fehler	1	error C2679: Binärer Operator '==': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'const gl::Buffer' akzeptiert (oder keine geeignete Konvertierung möglich)	c:\program files (x86)\microsoft visual studio 11.0\vc\include\xutility	3186	1
</code></pre>
<p>Das Beispielprojekt:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;memory&gt;
#include &lt;vector&gt;
#include &lt;iterator&gt;
#include &lt;algorithm&gt;

using namespace std;

namespace tl
{
class A
{
private:
    int a, b;
public:
	A() {}
    A(int a, int b)
    {
        this-&gt;a = a;
        this-&gt;b = b;
    }

    bool equal(const A&amp; other) const
    {
        if (a == other.a || b == other.b)
            return true;
        return false;
    }
};

bool operator==(const tl::A&amp; a, const tl::A&amp; b)
{
    return a.equal(b);
}

class B : public A
{
public:
	B(int a, int b) : A(a, b) {}
};

}

tl::B readB()
{
    int a, b;
    cout &lt;&lt; &quot;A a: &quot;;
    cin &gt;&gt; a;
    cout &lt;&lt; &quot; | b: &quot;;
    cin &gt;&gt; b;
    cout &lt;&lt; std::endl;
    return tl::B(a, b);
}

int main()
{
    tl::B t1 = readB();
    tl::B t2 = readB();

    cout &lt;&lt; (t1 == t2) &lt;&lt; endl;

    vector&lt;tl::A&gt; vec(2);
    vec.push_back(t1);
    vec.push_back(t2);

    auto iter = find&lt;vector&lt;tl::A&gt;::iterator&gt;(vec.begin(), vec.end(), t2);
    if (iter != vec.end())
        cout &lt;&lt; &quot;Founded!&quot;;
    else
        cout &lt;&lt; &quot;Not founded&quot;;

    std::cin.get();
}
</code></pre>
<p>Ich benutze Visual Studio 2012. Ich hoffe die Definitionen reichen, wenn nicht gibts den Quellcode auch.<br />
Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/315046/fehlender-quot-quot-operator-fehler-obwohl-vorhanden</link><generator>RSS for Node</generator><lastBuildDate>Fri, 31 Jul 2026 11:52:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/315046.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 22 Mar 2013 11:34:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fehlender &amp;quot;==&amp;quot; Operator Fehler, obwohl vorhanden on Fri, 22 Mar 2013 11:34:25 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich hab das Gefühl, dass mich C++ verarscht. Ich muss den &quot;==&quot; Operator meiner Klasse überladen, da ich ein vector damit fülle und std::find() ausführen will. Obwohl ich dies gemacht habe, beschwert sich der Kompiler über den fehlenden Operator. Das Beispiel Projekt, welches ziemlich ähnlich aufgebaut ist, lässt sich natürlich problemlos kompilieren und ausführen. Wie passt das zusammen, was mache ich falsch?</p>
<p>Hier der Header:</p>
<pre><code>#pragma once

//#include &quot;GraphicsContext.h&quot;

namespace gl
{
	class Buffer
	{
	protected:
		GraphicsContext&amp; context;
		void* data;
		bool locked;
	public:
		Buffer(GraphicsContext&amp; context, unsigned dataSize);
		virtual ~Buffer();

		void* Lock();
		void Unlock();

		bool Equal(const Buffer&amp; other) const;
		//bool operator ==(const Buffer&amp; op2) const;
	};

	bool operator==(const gl::Buffer&amp; lhs, const gl::Buffer&amp; rhs);
}
</code></pre>
<p>Hier die Methode welche std::find ausführt:</p>
<pre><code>void GraphicsContext::RegisterBuffer(Buffer&amp; buf)
	{
		auto iter = std::find&lt;std::vector&lt;Buffer*&gt;::iterator&gt;(buffers.begin(), buffers.end(), buf);
		if (iter != buffers.end())
			buffers.push_back(&amp;buf);
	}
</code></pre>
<p>Der Fehler:</p>
<pre><code>Fehler	1	error C2679: Binärer Operator '==': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'const gl::Buffer' akzeptiert (oder keine geeignete Konvertierung möglich)	c:\program files (x86)\microsoft visual studio 11.0\vc\include\xutility	3186	1
</code></pre>
<p>Das Beispielprojekt:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;memory&gt;
#include &lt;vector&gt;
#include &lt;iterator&gt;
#include &lt;algorithm&gt;

using namespace std;

namespace tl
{
class A
{
private:
    int a, b;
public:
	A() {}
    A(int a, int b)
    {
        this-&gt;a = a;
        this-&gt;b = b;
    }

    bool equal(const A&amp; other) const
    {
        if (a == other.a || b == other.b)
            return true;
        return false;
    }
};

bool operator==(const tl::A&amp; a, const tl::A&amp; b)
{
    return a.equal(b);
}

class B : public A
{
public:
	B(int a, int b) : A(a, b) {}
};

}

tl::B readB()
{
    int a, b;
    cout &lt;&lt; &quot;A a: &quot;;
    cin &gt;&gt; a;
    cout &lt;&lt; &quot; | b: &quot;;
    cin &gt;&gt; b;
    cout &lt;&lt; std::endl;
    return tl::B(a, b);
}

int main()
{
    tl::B t1 = readB();
    tl::B t2 = readB();

    cout &lt;&lt; (t1 == t2) &lt;&lt; endl;

    vector&lt;tl::A&gt; vec(2);
    vec.push_back(t1);
    vec.push_back(t2);

    auto iter = find&lt;vector&lt;tl::A&gt;::iterator&gt;(vec.begin(), vec.end(), t2);
    if (iter != vec.end())
        cout &lt;&lt; &quot;Founded!&quot;;
    else
        cout &lt;&lt; &quot;Not founded&quot;;

    std::cin.get();
}
</code></pre>
<p>Ich benutze Visual Studio 2012. Ich hoffe die Definitionen reichen, wenn nicht gibts den Quellcode auch.<br />
Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2308717</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2308717</guid><dc:creator><![CDATA[void_ptr]]></dc:creator><pubDate>Fri, 22 Mar 2013 11:34:25 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlender &amp;quot;==&amp;quot; Operator Fehler, obwohl vorhanden on Fri, 22 Mar 2013 11:44:10 GMT]]></title><description><![CDATA[<p>Bitte die Fehlermeldung umformatieren, ich möchte nicht immer 300000000 Meter nach rechts scrollen mit dem Browser um was zu lesen.</p>
<p>Zum Problem: Dein Operator== erwartet einen Buffer, bzw eine Referenz darauf, was syntaktisch beim Aufruf dasselbe ist.</p>
<p>Dein vector hält aber Zeiger auf Buffer Objekte (allein schon wegen den zeigern böse!). Der sucht nun also nach einem operator==(Buffer *, Buffer <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title="*)"
      alt="😉"
    /> bzw operator==(Buffer *, Buffer&amp;)</p>
<p>Und wieso lässt du den Compiler die Typen der find Funktion nicht selsbt herleiten?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2308723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2308723</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Fri, 22 Mar 2013 11:44:10 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlender &amp;quot;==&amp;quot; Operator Fehler, obwohl vorhanden on Fri, 22 Mar 2013 12:00:53 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Bitte die Fehlermeldung umformatieren, ich möchte nicht immer 300000000 Meter nach rechts scrollen mit dem Browser um was zu lesen.</p>
</blockquote>
<p>Oh das wusste ich nicht, keine Absicht. Kann ich leider auch nicht ändern, da ich nicht angemeldet bin, kann ein Moderator vielleicht aushelfen?</p>
<p>Danke für die Erklärung, ich dachte es gäbe nur einen Operator mit Referenzen. Jetzt klappts!</p>
<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Dein vector hält aber Zeiger auf Buffer Objekte (allein schon wegen den zeigern böse!).</p>
</blockquote>
<p>Ich weiß, der Kompiler hat wegen irgendwas gemeckert, als ich eine Referenz benutzen wollte. Das muss ich wohl nochmal versuchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2308727</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2308727</guid><dc:creator><![CDATA[void_ptr]]></dc:creator><pubDate>Fri, 22 Mar 2013 12:00:53 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlender &amp;quot;==&amp;quot; Operator Fehler, obwohl vorhanden on Fri, 22 Mar 2013 12:04:45 GMT]]></title><description><![CDATA[<p>Referenzen kannst du nicht in Listen Speichern, weil sie beim Erzeugen direkt initialisiert werden müssen &lt;--&gt; widerspricht Listen</p>
<p>Rohe Zeiger in Listen (sei es Arrays, Vectoren oder Bäume) sind nicht zu empfehlen, da du die &quot;gezeigten&quot; Objekte manuell löschen musst oder umgekehrt dafür sorgen musst, dass die referenzierten Objekte nicht zu früh gelöscht werden.</p>
<p>Wenn dein vector also den alleinigen Besitz der Objekte innehat, dann nimm std::vector&lt;std::unique_ptr&lt;Buffer&gt;&gt; (oder boost::ptr_vector&lt;Buffer&gt;), wenn die Objekte woanders gehalten werden nimm statt unique_ptr shared_ptr oder weak_ptr je nachdem...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2308732</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2308732</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Fri, 22 Mar 2013 12:04:45 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlender &amp;quot;==&amp;quot; Operator Fehler, obwohl vorhanden on Fri, 22 Mar 2013 12:38:45 GMT]]></title><description><![CDATA[<p>Zuerst wollte ich das mit shared_ptr lösen, dann jedoch habe ich gemerkt, dass das vielleicht nicht ideal ist, deshalb habe ich im Forum nachgefragt.<br />
<a href="http://www.c-plusplus.net/forum/314925" rel="nofollow">http://www.c-plusplus.net/forum/314925</a><br />
Dort wurde mir geraten, das ganze zu vereinfachen, weshalb ich dann auf die Zeiger umgestiegen bin. Doch das ist nicht die Lösung.<br />
Eigentlich wollte ich das so machen, dass der Buffer selbst erstellt werden kann, sich dieser dann beim GraphicsContext anmeldet und von iohm verwaltet wird,<br />
jedoch soll man auch in der Lage sein den Destruktor des Buffers selbst aufzurufen. Der Buffer meldet sich dann beim GraphicsContext ab.<br />
Wenn ich mir das so ansehe, wäre ein shared_ptr dann doch angebracht, oder? Schließlich kann der Buffer vom Benutzer sowohl auch vom GraphicsContext gelöscht werden.</p>
<p>Ein Factory-Pattern würde mir sonst noch einfallen, manchmal muss man einfach einen Kompromiss eingehen.<br />
Obwohl mir das Pattern in C++ nicht so gefällt, in C# lässt sich sowas besonders elegant machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2308743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2308743</guid><dc:creator><![CDATA[void_ptr]]></dc:creator><pubDate>Fri, 22 Mar 2013 12:38:45 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlender &amp;quot;==&amp;quot; Operator Fehler, obwohl vorhanden on Fri, 22 Mar 2013 12:53:45 GMT]]></title><description><![CDATA[<p>Naja, das sind verschiedene Dinge, die du haben willst.</p>
<p>Dass du deine Buffer speichern willst/musst ist keine Frage, aber dazu gehört dann auch, dass sie gelöscht werden, wenn sie wegsollen. Das ist am einfachsten und am sichersten mit Smart-Pointern zu lösen, wie gesagt unique_ptr.</p>
<p>Dass sich deine Buffer irgendwo an- oder abmelden ist ein anderes Problem. Und deinen Buffer sollte es auch eigentlich nicht interessieren, wo er gelagert oder registriert ist, da dies die Abhängigkeit signifikant erhöht. Er ist halt semantisch nicht korrelierend mit dem GraphicsContext.</p>
<p>Das GoF-Factory-Pattern würde ich hier nicht nehmen, eher sowas:</p>
<pre><code>class Buffer
{
public:
    Buffer(int x /*, und andere Parameter*/);
    // .....
};

std::shared_ptr&lt;Buffer&gt; createBuffer(std::vector&lt;std::shared_ptr&lt;Buffer&gt;&gt; &amp; contextList, int x /*, und deine anderen CTor Parameter*/)
{
    std::shared_ptr&lt;Buffer&gt; tmp(new Buffer(x, ...));
    contextList.push_back(tmp);
    return tmp;
}
</code></pre>
<p>Du kapselst so den Construktor ab, aber hängst deine Bedingungen dran (halt, dass dein objekt direkt in eine Liste geshcoben wird)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2308751</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2308751</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Fri, 22 Mar 2013 12:53:45 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlender &amp;quot;==&amp;quot; Operator Fehler, obwohl vorhanden on Fri, 22 Mar 2013 13:17:25 GMT]]></title><description><![CDATA[<p>Wäre das nicht eine Factory? Jedenfalls, so denke ich, in meinem Fall, denn Buffer ist eigentlich nur die Basisklasse für FrameBuffer, VertexBuffer, ... .</p>
<p>Das heißt das GraphicsContext so aussehen würde?</p>
<pre><code>class GraphicsContext
{
private:
	std::vector&lt;std::shared_ptr&lt;Buffer&gt;&gt; buffers;
	//...
public:
	std::shared_ptr&lt;FrameBuffer&gt; createFrameBuffer(/* ... */)
	{
		std::shared_ptr&lt;FrameBuffer&gt; tmp(new FrameBuffer(/* ... */));
		buffers.push_back(tmp);
		return tmp;
	}
	std::shared_ptr&lt;VertexBuffer&gt; createVertexBuffer(/* ... */);
	//...
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2308759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2308759</guid><dc:creator><![CDATA[void_ptr]]></dc:creator><pubDate>Fri, 22 Mar 2013 13:17:25 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlender &amp;quot;==&amp;quot; Operator Fehler, obwohl vorhanden on Fri, 22 Mar 2013 13:23:06 GMT]]></title><description><![CDATA[<p>Eventuell würde ich die Methoden hier rauslösen und sie entweder in einer statischen Klasse (halbwegs kontextfrei) unterbringen oder sogar direkt frei machen.</p>
<p>Nein, das Factory-Method Pattern macht was anderes, der Wikipedia Artikel sit da ganz gut...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2308762</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2308762</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Fri, 22 Mar 2013 13:23:06 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlender &amp;quot;==&amp;quot; Operator Fehler, obwohl vorhanden on Fri, 22 Mar 2013 13:36:46 GMT]]></title><description><![CDATA[<p>Alles klar. Jetzt hab ichs verstanden, vielen Dank für deine Hilfe. Bin schon ewig an dieser Designfrage gesessen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2308773</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2308773</guid><dc:creator><![CDATA[void_ptr]]></dc:creator><pubDate>Fri, 22 Mar 2013 13:36:46 GMT</pubDate></item></channel></rss>