<?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[std::map mit eigener Klasse als Schlüssel]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich wollte eine std::map erstellen, die als Schlüssel eine von mir<br />
geschriebene Klasse benutzt. Die Klasse stellt einen dreidimensionale<br />
Koordinate dar und heißt Point, mit x, y und z als Member.</p>
<p>Ich definiere mir also in einer anderen Header-Datei eine map:</p>
<pre><code class="language-cpp">std::map&lt;Point, Vec3f&gt; data;
</code></pre>
<p>und wenn ich dann in der dazugehörigen *.cpp-Datei mit folgendem</p>
<pre><code class="language-cpp">this-&gt;data[Point(x,y,z)] = Vec3f(vx,vy,vz);
</code></pre>
<p>auf den Member data zugreifen will, verschluckt sich der Compiler:</p>
<blockquote>
<p>error C2678: Binärer Operator '&lt;': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'const vc::Point' akzeptiert (oder keine geeignete Konvertierung möglich)</p>
</blockquote>
<p>(VS2010)</p>
<p>Was muss ich beachten beim Design der Klasse Point, damit ich sie als Schlüssel<br />
in einer map benutzen kann? Dachte ich könnte das Problem mit<br />
entsprechenden &lt; Operator Überladungen umgehen, aber klappt nicht:</p>
<pre><code class="language-cpp">bool operator &lt; (const Point&amp; p1, const Point&amp; p2){...}
bool Point::operator&lt; (Point&amp; p) {...}
</code></pre>
<p>Stellt nicht die zweite Zeile einen Operator dar, der als linksseitigen<br />
Operanden vc::Point akzeptiert? Oder verwechsel ich da etwas?</p>
<p>Danke schonmal für etwas Tipps. Konnte dazu bisher noch keine wirkliche Hilfe finden.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/279083/std-map-mit-eigener-klasse-als-schlüssel</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 19:11:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/279083.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 18 Dec 2010 21:26:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::map mit eigener Klasse als Schlüssel on Sat, 18 Dec 2010 21:26:47 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich wollte eine std::map erstellen, die als Schlüssel eine von mir<br />
geschriebene Klasse benutzt. Die Klasse stellt einen dreidimensionale<br />
Koordinate dar und heißt Point, mit x, y und z als Member.</p>
<p>Ich definiere mir also in einer anderen Header-Datei eine map:</p>
<pre><code class="language-cpp">std::map&lt;Point, Vec3f&gt; data;
</code></pre>
<p>und wenn ich dann in der dazugehörigen *.cpp-Datei mit folgendem</p>
<pre><code class="language-cpp">this-&gt;data[Point(x,y,z)] = Vec3f(vx,vy,vz);
</code></pre>
<p>auf den Member data zugreifen will, verschluckt sich der Compiler:</p>
<blockquote>
<p>error C2678: Binärer Operator '&lt;': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'const vc::Point' akzeptiert (oder keine geeignete Konvertierung möglich)</p>
</blockquote>
<p>(VS2010)</p>
<p>Was muss ich beachten beim Design der Klasse Point, damit ich sie als Schlüssel<br />
in einer map benutzen kann? Dachte ich könnte das Problem mit<br />
entsprechenden &lt; Operator Überladungen umgehen, aber klappt nicht:</p>
<pre><code class="language-cpp">bool operator &lt; (const Point&amp; p1, const Point&amp; p2){...}
bool Point::operator&lt; (Point&amp; p) {...}
</code></pre>
<p>Stellt nicht die zweite Zeile einen Operator dar, der als linksseitigen<br />
Operanden vc::Point akzeptiert? Oder verwechsel ich da etwas?</p>
<p>Danke schonmal für etwas Tipps. Konnte dazu bisher noch keine wirkliche Hilfe finden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996412</guid><dc:creator><![CDATA[AlexSpritze]]></dc:creator><pubDate>Sat, 18 Dec 2010 21:26:47 GMT</pubDate></item><item><title><![CDATA[Reply to std::map mit eigener Klasse als Schlüssel on Sat, 18 Dec 2010 21:34:35 GMT]]></title><description><![CDATA[<p>error C2678: Binärer Operator '&lt;': Es konnte kein Operator gefunden werden, der einen <strong>linksseitigen</strong> Operanden vom Typ '<strong>const</strong> vc::Point' akzeptiert (oder keine geeignete Konvertierung möglich). Du hast 2 Möglichkeiten! Für weitere Tipps + in den Channel schreiben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996415</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996415</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 18 Dec 2010 21:34:35 GMT</pubDate></item><item><title><![CDATA[Reply to std::map mit eigener Klasse als Schlüssel on Sat, 18 Dec 2010 21:35:02 GMT]]></title><description><![CDATA[<p>Du kannst das Problem einfach lösen, indem du dir den Constructor von std::map einmal komplett anschaust.</p>
<pre><code class="language-cpp">template &lt;
    class Key,
    class T,
    class Compare = std::less&lt;Key&gt;, // der Punkt ist für dich interessant
    class Allocator = std::allocator&lt; std::pair&lt;const Key, T&gt; &gt;
&gt; class map;
</code></pre>
<p><a href="http://www.cplusplus.com/forum/general/4444/" rel="nofollow">http://www.cplusplus.com/forum/general/4444/</a></p>
<p>Bei den Operatoren kann ich dir nicht helfen, sollte aber gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996416</guid><dc:creator><![CDATA[Nick Unbekannt]]></dc:creator><pubDate>Sat, 18 Dec 2010 21:35:02 GMT</pubDate></item><item><title><![CDATA[Reply to std::map mit eigener Klasse als Schlüssel on Sat, 18 Dec 2010 21:37:47 GMT]]></title><description><![CDATA[<p>Der erste Operator sollte funktionieren. Wenn du den zweiten benutzen willst, sollte er const sein. Was du in deinen Codeschnippseln nicht zeigst: was ist vc und wo sind die Operatoren definiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996417</guid><dc:creator><![CDATA[Manni66]]></dc:creator><pubDate>Sat, 18 Dec 2010 21:37:47 GMT</pubDate></item><item><title><![CDATA[Reply to std::map mit eigener Klasse als Schlüssel on Sat, 18 Dec 2010 21:45:39 GMT]]></title><description><![CDATA[<p>Nick hat im Bezug auf den Operator unrecht.</p>
<p>Edit: Wobei mir beim weiteren Nachdenken Zweifel kommen, ob der Compiler wirklich bei dem ersten Fund auf der Suche nach einem Operator schluss machen darf. Aber irgendwie ist das auch egal, weil es doch gar keinen Sinn macht, den Vergleichsoperator als nicht-const-Methode zu implementieren, vor allem wenn die freistehende Funktion das dann auf einmal doch kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996418</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996418</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 18 Dec 2010 21:45:39 GMT</pubDate></item><item><title><![CDATA[Reply to std::map mit eigener Klasse als Schlüssel on Sat, 18 Dec 2010 21:50:07 GMT]]></title><description><![CDATA[<p>AlexSpritze schrieb:</p>
<blockquote>
<pre><code class="language-cpp">std::map&lt;Point, Vec3f&gt; data;
</code></pre>
<blockquote>
<p>error C2678: Binärer Operator '&lt;': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'const vc::Point' akzeptiert (oder keine geeignete Konvertierung möglich)</p>
</blockquote>
<pre><code class="language-cpp">bool operator &lt; (const Point&amp; p1, const Point&amp; p2){...}
</code></pre>
</blockquote>
<p>Das sieht schon mal nicht schlecht aus. Es müsste funktionieren, wenn Du dies als freie Funktion in demselben Namensraum wie Deine Klasse Point deklarierst. Das mit dem Namensraum ist wichtig. Stichwort ADL (argument-dependent-lookup).</p>
<p>AlexSpritze schrieb:</p>
<blockquote>
<pre><code class="language-cpp">bool Point::operator&lt; (Point&amp; p) {...}
</code></pre>
</blockquote>
<p>Das soll wohl eine nicht-statische Elementfunktion sein. Hier fehlen die zwei <code>const</code> s:</p>
<pre><code class="language-cpp">bool Point::operator&lt; (Point const&amp; p) const {...}
</code></pre>
<p>Natürlich darfst Du nur eine der beiden Varianten verwenden. Aus Symmetriegründen macht man das typischerweise mit einer freien Funktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996420</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996420</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 18 Dec 2010 21:50:07 GMT</pubDate></item><item><title><![CDATA[Reply to std::map mit eigener Klasse als Schlüssel on Sat, 18 Dec 2010 21:48:29 GMT]]></title><description><![CDATA[<p>Decimad schrieb:</p>
<blockquote>
<p>Nick hat im Bezug auf den Operator unrecht.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Wie meinen?<br />
Ich hab mir die Operatoren nicht angesehen, weil ich mich damit nicht beschäftigt habe. Aber ein richtig formulierter und sinnvoller &quot;kleiner als&quot;-Operator sollte funktionierten. Nichts anderes passiert bei den Integralen Typen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996422</guid><dc:creator><![CDATA[Nick Unbekannt]]></dc:creator><pubDate>Sat, 18 Dec 2010 21:48:29 GMT</pubDate></item><item><title><![CDATA[Reply to std::map mit eigener Klasse als Schlüssel on Sat, 18 Dec 2010 21:50:22 GMT]]></title><description><![CDATA[<p>Naja, ich hatte das so interpretiert, dass du meintest dass es mit <strong>diesen</strong> (also denen vom TE) funtionieren sollte. Sorry falls ich das missverstanden habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996423</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996423</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 18 Dec 2010 21:50:22 GMT</pubDate></item><item><title><![CDATA[Reply to std::map mit eigener Klasse als Schlüssel on Sat, 18 Dec 2010 22:00:04 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/1616">@krümel</a>: Ist die Symmetrie da echt so toll, dass man da so viele friend-Deklarationen in Kauf nimmt? Hab den Quelltext anderer noch nicht nach diesem Aspekt durchwühlt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996425</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996425</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 18 Dec 2010 22:00:04 GMT</pubDate></item><item><title><![CDATA[Reply to std::map mit eigener Klasse als Schlüssel on Sat, 18 Dec 2010 22:03:15 GMT]]></title><description><![CDATA[<p>Decimad schrieb:</p>
<blockquote>
<p>Edit: Wobei mir beim weiteren Nachdenken Zweifel kommen, ob der Compiler wirklich bei dem ersten Fund auf der Suche nach einem Operator schluss machen darf.</p>
</blockquote>
<p>Die Suche findet &quot;von innen nach außen&quot; bzgl Gültigkeitsbereiche statt. Wird in einem Gültigkeitsbereich der Name gefunden, wird gestoppt. Ist der Compiler im globalen Gültigkeitsbereich gelandet, werden auch schließlich alle über using-Direktiven &quot;eingebundenen&quot; Namensräume durchsucht. Schließlich werden noch assoziierte Namensräume durchsucht (ADL). Es gibt aber auch eine Ausnahme, wo ADL nicht greift. Dass bei einem Fund die übergeordneten Gültigkeitsbereiche nicht mehr abgesucht werden führt zu dem &quot;Hiding&quot;-Effekt.</p>
<p>Lesetipps:<br />
<a href="http://www.gotw.ca/publications/mill02.htm" rel="nofollow">http://www.gotw.ca/publications/mill02.htm</a><br />
<a href="http://www.gotw.ca/publications/mill08.htm" rel="nofollow">http://www.gotw.ca/publications/mill08.htm</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996426</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996426</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 18 Dec 2010 22:03:15 GMT</pubDate></item><item><title><![CDATA[Reply to std::map mit eigener Klasse als Schlüssel on Sat, 18 Dec 2010 22:06:45 GMT]]></title><description><![CDATA[<p>Decimad schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/1616">@krümel</a>: Ist die Symmetrie da echt so toll, dass man da so viele friend-Deklarationen in Kauf nimmt?</p>
</blockquote>
<p>Eine freie Funktion muss natürlich keine friend-Funktion sein. Ich würde eher erwarten, dass die Schnittstelle der Klasse Point all die für einen Vergleich nötigen Informationen rausrückt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996427</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996427</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 18 Dec 2010 22:06:45 GMT</pubDate></item><item><title><![CDATA[Reply to std::map mit eigener Klasse als Schlüssel on Sat, 18 Dec 2010 22:15:41 GMT]]></title><description><![CDATA[<p>Da hast du natürlich Recht. *ditsch*<br />
Edit: Wobei mich das Gefühl beschleicht, dass man da irgendwann doch unter Umständen Implementierungsdetails nach außen durchschleifen muss, dafür.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1996428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1996428</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 18 Dec 2010 22:15:41 GMT</pubDate></item></channel></rss>