<?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[Operator-Überladung für sort() bei Struct-Array]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe ein Problem mit der Operator-Überladung von &lt;, die ich für sort() brauche, um Structs zu sortieren.</p>
<p>Wenn ich den Operator mit</p>
<pre><code class="language-cpp">bool operator&lt;(const tagundinhalt&amp; a, const tagundinhalt&amp; b) {
	   return a.tag &lt; b.tag;
   }
</code></pre>
<p>überlade, so, wie ich das aus <a href="http://www.fredosaurus.com/notes-cpp/algorithms/sorting/stl-sort-arrays.html" rel="nofollow">http://www.fredosaurus.com/notes-cpp/algorithms/sorting/stl-sort-arrays.html</a> verstanden habe, liefert mir G++ folgende &quot;kompakte&quot; Fehlerausgabe:</p>
<pre><code>/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_iterator_base_types.h: In instantiation of ‘std::iterator_traits&lt;tagundinhalt&gt;’:
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2703:   instantiated from ‘void std::sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = tagundinhalt]’
./src/sortieren.cpp:22:   instantiated from here
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_iterator_base_types.h:129: error: no type named ‘iterator_category’ in ‘struct tagundinhalt’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_iterator_base_types.h:130: error: no type named ‘value_type’ in ‘struct tagundinhalt’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_iterator_base_types.h:131: error: no type named ‘difference_type’ in ‘struct tagundinhalt’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_iterator_base_types.h:132: error: no type named ‘pointer’ in ‘struct tagundinhalt’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_iterator_base_types.h:133: error: no type named ‘reference’ in ‘struct tagundinhalt’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h: In function ‘void std::sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = tagundinhalt]’:
./src/sortieren.cpp:22:   instantiated from here
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2711: error: no match for ‘operator!=’ in ‘__first != __last’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2713: error: no match for ‘operator-’ in ‘__last - __first’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_bvector.h:182: note: candidates are: ptrdiff_t std::operator-(const std::_Bit_iterator_base&amp;, const std::_Bit_iterator_base&amp;)
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h: In function ‘void std::__final_insertion_sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = tagundinhalt]’:
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2714:   instantiated from ‘void std::sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = tagundinhalt]’
./src/sortieren.cpp:22:   instantiated from here
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2357: error: no match for ‘operator-’ in ‘__last - __first’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_bvector.h:182: note: candidates are: ptrdiff_t std::operator-(const std::_Bit_iterator_base&amp;, const std::_Bit_iterator_base&amp;)
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2359: error: no match for ‘operator+’ in ‘__first + 16’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_bvector.h:267: note: candidates are: std::_Bit_iterator std::operator+(ptrdiff_t, const std::_Bit_iterator&amp;)
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_bvector.h:353: note:                 std::_Bit_const_iterator std::operator+(ptrdiff_t, const std::_Bit_const_iterator&amp;)
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2360: error: no match for ‘operator+’ in ‘__first + 16’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_bvector.h:267: note: candidates are: std::_Bit_iterator std::operator+(ptrdiff_t, const std::_Bit_iterator&amp;)
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_bvector.h:353: note:                 std::_Bit_const_iterator std::operator+(ptrdiff_t, const std::_Bit_const_iterator&amp;)
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h: In function ‘void std::__insertion_sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = tagundinhalt]’:
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2363:   instantiated from ‘void std::__final_insertion_sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = tagundinhalt]’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2714:   instantiated from ‘void std::sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = tagundinhalt]’
./src/sortieren.cpp:22:   instantiated from here
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2270: error: no match for ‘operator==’ in ‘__first == __last’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2273: error: no match for ‘operator+’ in ‘__first + 1’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_bvector.h:267: note: candidates are: std::_Bit_iterator std::operator+(ptrdiff_t, const std::_Bit_iterator&amp;)
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_bvector.h:353: note:                 std::_Bit_const_iterator std::operator+(ptrdiff_t, const std::_Bit_const_iterator&amp;)
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2273: error: no match for ‘operator!=’ in ‘__i != __last’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2273: error: no match for ‘operator++’ in ‘++__i’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2277: error: no match for ‘operator*’ in ‘*__first’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2279: error: no match for ‘operator+’ in ‘__i + 1’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_bvector.h:267: note: candidates are: std::_Bit_iterator std::operator+(ptrdiff_t, const std::_Bit_iterator&amp;)
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_bvector.h:353: note:                 std::_Bit_const_iterator std::operator+(ptrdiff_t, const std::_Bit_const_iterator&amp;)
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2276: error: no match for ‘operator*’ in ‘*__first’
</code></pre>
<p>Keine schöne Sache, wie ich finde. So, wie ich das interpretiere, zerstört meine Operator-Überladung sämtliche Operator-Definitionen.</p>
<p>Kann mir jemand helfen?<br />
Danke schonmal für eure Mühen!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/173592/operator-überladung-für-sort-bei-struct-array</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 17:32:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/173592.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 17 Feb 2007 16:12:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Operator-Überladung für sort() bei Struct-Array on Tue, 27 Feb 2007 22:08:16 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe ein Problem mit der Operator-Überladung von &lt;, die ich für sort() brauche, um Structs zu sortieren.</p>
<p>Wenn ich den Operator mit</p>
<pre><code class="language-cpp">bool operator&lt;(const tagundinhalt&amp; a, const tagundinhalt&amp; b) {
	   return a.tag &lt; b.tag;
   }
</code></pre>
<p>überlade, so, wie ich das aus <a href="http://www.fredosaurus.com/notes-cpp/algorithms/sorting/stl-sort-arrays.html" rel="nofollow">http://www.fredosaurus.com/notes-cpp/algorithms/sorting/stl-sort-arrays.html</a> verstanden habe, liefert mir G++ folgende &quot;kompakte&quot; Fehlerausgabe:</p>
<pre><code>/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_iterator_base_types.h: In instantiation of ‘std::iterator_traits&lt;tagundinhalt&gt;’:
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2703:   instantiated from ‘void std::sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = tagundinhalt]’
./src/sortieren.cpp:22:   instantiated from here
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_iterator_base_types.h:129: error: no type named ‘iterator_category’ in ‘struct tagundinhalt’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_iterator_base_types.h:130: error: no type named ‘value_type’ in ‘struct tagundinhalt’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_iterator_base_types.h:131: error: no type named ‘difference_type’ in ‘struct tagundinhalt’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_iterator_base_types.h:132: error: no type named ‘pointer’ in ‘struct tagundinhalt’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_iterator_base_types.h:133: error: no type named ‘reference’ in ‘struct tagundinhalt’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h: In function ‘void std::sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = tagundinhalt]’:
./src/sortieren.cpp:22:   instantiated from here
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2711: error: no match for ‘operator!=’ in ‘__first != __last’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2713: error: no match for ‘operator-’ in ‘__last - __first’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_bvector.h:182: note: candidates are: ptrdiff_t std::operator-(const std::_Bit_iterator_base&amp;, const std::_Bit_iterator_base&amp;)
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h: In function ‘void std::__final_insertion_sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = tagundinhalt]’:
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2714:   instantiated from ‘void std::sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = tagundinhalt]’
./src/sortieren.cpp:22:   instantiated from here
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2357: error: no match for ‘operator-’ in ‘__last - __first’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_bvector.h:182: note: candidates are: ptrdiff_t std::operator-(const std::_Bit_iterator_base&amp;, const std::_Bit_iterator_base&amp;)
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2359: error: no match for ‘operator+’ in ‘__first + 16’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_bvector.h:267: note: candidates are: std::_Bit_iterator std::operator+(ptrdiff_t, const std::_Bit_iterator&amp;)
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_bvector.h:353: note:                 std::_Bit_const_iterator std::operator+(ptrdiff_t, const std::_Bit_const_iterator&amp;)
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2360: error: no match for ‘operator+’ in ‘__first + 16’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_bvector.h:267: note: candidates are: std::_Bit_iterator std::operator+(ptrdiff_t, const std::_Bit_iterator&amp;)
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_bvector.h:353: note:                 std::_Bit_const_iterator std::operator+(ptrdiff_t, const std::_Bit_const_iterator&amp;)
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h: In function ‘void std::__insertion_sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = tagundinhalt]’:
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2363:   instantiated from ‘void std::__final_insertion_sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = tagundinhalt]’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2714:   instantiated from ‘void std::sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = tagundinhalt]’
./src/sortieren.cpp:22:   instantiated from here
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2270: error: no match for ‘operator==’ in ‘__first == __last’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2273: error: no match for ‘operator+’ in ‘__first + 1’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_bvector.h:267: note: candidates are: std::_Bit_iterator std::operator+(ptrdiff_t, const std::_Bit_iterator&amp;)
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_bvector.h:353: note:                 std::_Bit_const_iterator std::operator+(ptrdiff_t, const std::_Bit_const_iterator&amp;)
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2273: error: no match for ‘operator!=’ in ‘__i != __last’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2273: error: no match for ‘operator++’ in ‘++__i’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2277: error: no match for ‘operator*’ in ‘*__first’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2279: error: no match for ‘operator+’ in ‘__i + 1’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_bvector.h:267: note: candidates are: std::_Bit_iterator std::operator+(ptrdiff_t, const std::_Bit_iterator&amp;)
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_bvector.h:353: note:                 std::_Bit_const_iterator std::operator+(ptrdiff_t, const std::_Bit_const_iterator&amp;)
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2276: error: no match for ‘operator*’ in ‘*__first’
</code></pre>
<p>Keine schöne Sache, wie ich finde. So, wie ich das interpretiere, zerstört meine Operator-Überladung sämtliche Operator-Definitionen.</p>
<p>Kann mir jemand helfen?<br />
Danke schonmal für eure Mühen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1230176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1230176</guid><dc:creator><![CDATA[Molinman]]></dc:creator><pubDate>Tue, 27 Feb 2007 22:08:16 GMT</pubDate></item><item><title><![CDATA[Reply to Operator-Überladung für sort() bei Struct-Array on Mon, 19 Feb 2007 07:08:11 GMT]]></title><description><![CDATA[<p>Zeig doch mal den Code, wo dieser Operator (bzw. die sort()-Funktion) verwendet wird. Die Fehlermeldungen deuten darauf hin, daß du die struct 'tagundinhalt' als Iterator verwendet hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1230882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1230882</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 19 Feb 2007 07:08:11 GMT</pubDate></item><item><title><![CDATA[Reply to Operator-Überladung für sort() bei Struct-Array on Tue, 27 Feb 2007 19:53:49 GMT]]></title><description><![CDATA[<p>Servus, danke für die Antwort und sorry, dass ich jetzt erst antworte.<br />
Ich habe mir bei dem Versuch, in mehreren Schritten meien FAt32-Partition auf ext3 umzustellen, meine Partitionstabelle zerschossen und konnte jetzt einige Tage nicht ins Internet <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Hier die Funktion, die aber wohl nicht gerade viel hilft, ich fürchte, ich habe nicht ganz verstanden, was du gerne sehen würdest:</p>
<pre><code class="language-cpp">sort( tag[0], tag[MAX_STRUCT+1] );
</code></pre>
<p>Tatsächlich treten die beschriebenen Fehlermeldungen nicht auf, wenn ich diese sort-Anweisung auskommentiere.<br />
Was habe ich denn bei diesem eigentlich simplen Aufruf falsch gemacht?</p>
<p>Edit: Falls du irgendwelche Erklärungen brauchst, was zum Beispiel die Bedeutungen und dahinterstehenden Werte von MAX_STRUCT angeht, einfach fragen. Ich weiß nicht, inwiefern sich die Daten selbst erklären oder ohnehin unwichtig sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1236412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1236412</guid><dc:creator><![CDATA[Molinman]]></dc:creator><pubDate>Tue, 27 Feb 2007 19:53:49 GMT</pubDate></item><item><title><![CDATA[Reply to Operator-Überladung für sort() bei Struct-Array on Tue, 27 Feb 2007 20:15:35 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">sort( &amp;tag[0], &amp;tag[MAX_STRUCT+1] );
</code></pre>
<p>Das sollte es tun. Falls tag ein Zeiger ist gehts sogar noch simpler:</p>
<pre><code class="language-cpp">sort (tag, tag + MAX_STRUCT + 1);
</code></pre>
<p>Falls tag ein Standardcontainer ist, solltest du folgendes verwenden:</p>
<pre><code class="language-cpp">sort (tag.begin (), tag.end ());
</code></pre>
<p>sort nimmt als Parameter Iteratoren. Du hast aber stattdessen ein struct übergeben (der Indexzugriff liefert immer ein Objekt zurück).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1236421</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1236421</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Tue, 27 Feb 2007 20:15:35 GMT</pubDate></item><item><title><![CDATA[Reply to Operator-Überladung für sort() bei Struct-Array on Tue, 27 Feb 2007 22:21:21 GMT]]></title><description><![CDATA[<p>Ah, verstehe.<br />
Danke, das Programm läuft erstmal durch!<br />
Das Problem ist: Nach der Sortierung ist mein Struct-Array leer.</p>
<p>Was sowieso meiner Meinung nach so nicht stimmen kann, ist, dass ich sort ja Adressen übergebe, von der Operator-Überladung aber keine Pointervariablen entgegengenommen werden.</p>
<p>Müsste die Überladung dann nicht eigentlich so aussehen:</p>
<pre><code class="language-cpp">bool operator&lt;(const tagundinhalt *a, const tagundinhalt *b) {
	   return a.tag &lt; b.tag;
   }
</code></pre>
<p>Ich komme leider mit Pointern im Zusammenhang mit Arrays und zusätzlich noch Structs noch nicht ganz klar (weswegen ich in meinem Programm statt Pointern globale Variablen verwende <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> )</p>
<p>Dass es nicht so heißen muss, wie oben beschreiben, hat mir G++ mit einer ziemlichen Kraut-und-Rüben-Mitteilung klar gemacht, die in etwa so lautet:</p>
<pre><code>./src/header.h:52: error: ‘bool operator&lt;(const tagundinhalt*, const tagundinhalt*)’ must have an argument of class or enumerated type
./src/header.h: In function ‘bool operator&lt;(const tagundinhalt*, const tagundinhalt*)’:
./src/header.h:53: error: request for member ‘tag’ in ‘a’, which is of non-class type ‘const tagundinhalt*’
./src/header.h:53: error: request for member ‘tag’ in ‘b’, which is of non-class type ‘const tagundinhalt*’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h: In function ‘void std::partial_sort(_RandomAccessIterator, _RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = tagundinhalt*]’:
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2630:   instantiated from ‘void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size) [with _RandomAccessIterator = tagundinhalt*, _Size = int]’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2713:   instantiated from ‘void std::sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = tagundinhalt*]’
./src/sortieren.cpp:17:   instantiated from here
</code></pre>
<p>Das geht noch weiter, dies schien mir aber der wichtigste Teil zu sein.<br />
Offensichtlich möchte die Überladung eine Klasse (bzw. einen &quot;enumerated type&quot;, das wäre doch ein Array, oder?) sehen, mit der ich natürlich nicht dienen kann, da mein C-C++-Mischmasch ja noch Structs verwendet.</p>
<p>Wie komme ich hier weiter? Danke schonmal!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1236480</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1236480</guid><dc:creator><![CDATA[Molinman]]></dc:creator><pubDate>Tue, 27 Feb 2007 22:21:21 GMT</pubDate></item><item><title><![CDATA[Reply to Operator-Überladung für sort() bei Struct-Array on Wed, 28 Feb 2007 07:15:19 GMT]]></title><description><![CDATA[<p>Molinman schrieb:</p>
<blockquote>
<p>Ah, verstehe.<br />
Danke, das Programm läuft erstmal durch!<br />
Das Problem ist: Nach der Sortierung ist mein Struct-Array leer.</p>
<p>Was sowieso meiner Meinung nach so nicht stimmen kann, ist, dass ich sort ja Adressen übergebe, von der Operator-Überladung aber keine Pointervariablen entgegengenommen werden.</p>
</blockquote>
<p>sort() übernimmt Iteratoren (eine Art Verallgemeinerung von Zeigern) auf den Anfang und das Ende des zu sortierenden Bereiches. An seine Vergleichsfunktion übergibt es aber die Inhalte der zu sortierenden Elemente (Iterator- nzw. Pointer-Vergleiche würden da wenig Sinn machen). Deshalb benötigt dein operator&lt; auch zwei Referenzen als Parameter (eigentlich klappt auch Wert-Übergabe, aber die ist bei großen Objekten wenig sinnvoll).</p>
<blockquote>
<p>Ich komme leider mit Pointern im Zusammenhang mit Arrays und zusätzlich noch Structs noch nicht ganz klar (weswegen ich in meinem Programm statt Pointern globale Variablen verwende <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> )</p>
</blockquote>
<p>In Kurzform: In einem Array stehen die Objekte hintereinander. Und wenn es die Umstände erfordern, kannst du den Array-Namen implizit als Zeiger (auf das erste Element) verwenden. Beim Index-Zugriff bekommst du dagegen das n-te Element heraus.</p>
<blockquote>
<p>Dass es nicht so heißen muss, wie oben beschreiben, hat mir G++ mit einer ziemlichen Kraut-und-Rüben-Mitteilung klar gemacht, die in etwa so lautet:</p>
<pre><code>./src/header.h:52: error: ‘bool operator&lt;(const tagundinhalt*, const tagundinhalt*)’ must have an argument of class or enumerated type
./src/header.h: In function ‘bool operator&lt;(const tagundinhalt*, const tagundinhalt*)’:
./src/header.h:53: error: request for member ‘tag’ in ‘a’, which is of non-class type ‘const tagundinhalt*’
./src/header.h:53: error: request for member ‘tag’ in ‘b’, which is of non-class type ‘const tagundinhalt*’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h: In function ‘void std::partial_sort(_RandomAccessIterator, _RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = tagundinhalt*]’:
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2630:   instantiated from ‘void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size) [with _RandomAccessIterator = tagundinhalt*, _Size = int]’
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2713:   instantiated from ‘void std::sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = tagundinhalt*]’
./src/sortieren.cpp:17:   instantiated from here
</code></pre>
</blockquote>
<p>Und die Fehlermeldung in deinem Eröffnungspost teilt dir genauso unmissverständlich mit, daß dein Ansatz <code>sort(tag[0],tag[n]);</code> Unfug ist <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="😉"
    /></p>
<p>Du <strong>mußt</strong> den STL-Algorithmen Iteratoren übergeben, damit sie arbeiten können, daran führt kein Weg vorbei. (und wenn du dir das Beispiel ansiehst, auf dem dein Code aufbaut - dort steht auch nicht <code>sort(a[0],a[7]);</code> )</p>
<blockquote>
<p>Das geht noch weiter, dies schien mir aber der wichtigste Teil zu sein.<br />
Offensichtlich möchte die Überladung eine Klasse (bzw. einen &quot;enumerated type&quot;, das wäre doch ein Array, oder?) sehen, mit der ich natürlich nicht dienen kann, da mein C-C++-Mischmasch ja noch Structs verwendet.</p>
</blockquote>
<p>Zur Operator-Überladung benötigst du mindestens einen User-definierten Typ (das sind struct, class, enum, union) - die Redefinition der Operatoren für Build-ins (inklusive Zeigern) ist nicht erlaubt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1236563</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1236563</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 28 Feb 2007 07:15:19 GMT</pubDate></item><item><title><![CDATA[Reply to Operator-Überladung für sort() bei Struct-Array on Wed, 28 Feb 2007 16:57:20 GMT]]></title><description><![CDATA[<p>Eieiei, ok, verstehe. Danke.<br />
Da war ich zu strikt programmiert auf &quot;wenn ich einer Funktion Adressen übergebe, dann muss sie auch Pointervariablen annehmen&quot;.</p>
<p>Gut, dann verstehe ich jetzt, wie sort funktioniert - allerdings leider immer noch nicht, warum nach dem Sortiervorgang mein Struct komplett leer ist.</p>
<p>Mein Struct sieht folgendermaßen aus:</p>
<pre><code class="language-cpp">struct tagundinhalt{
	   int inhaltzaehler;
	   std::string tag;
	   std::string inhalt[MAX_INHALT_ANZAHL];
   };
</code></pre>
<p>Sowohl die int inhaltzaehler als auch tag und inhalt sind auf 0 gesetzt bzw. komplett leer.<br />
(Besonders, dass alle inhaltzaehler ausgerechnet auf 0 gesetzt sind, macht mich stutzig, denn das klingt nicht gerade nach einem seltsamen Willkür-Fehler)<br />
Auch wenn ich beispielsweise nach inhaltzaehler sortieren lasse, bekomme ich dasselbe leere Array.<br />
An welcher Stelle könnte hier der Fehler liegen?</p>
<p>Wenn ich statt</p>
<pre><code class="language-cpp">return a.tag &lt; b.tag
</code></pre>
<p>einfach immer true zurückgeben lasse, bekomme ich ein Segmentation fault.<br />
Wenn ich immer false zurückgeben lasse, bekomme ich dasselbe Ergebnis wie bei dem echten Vergleich von a.tag und b.tag (Nur für den Fall, dass das von irgendeiner Bedeutung ist bzw. weiterhilft)</p>
<p>Und: ist es normal, dass sich nach der Sortierung mein Array an derselben Stelle im Speicher befindet? (Ich nehme schon an, schließlich kann sort nicht eigenhändig dauerhaft Speicher reservieren, oder kann es das? Ich wollte das jedenfalls erwähnt haben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1236913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1236913</guid><dc:creator><![CDATA[Molinman]]></dc:creator><pubDate>Wed, 28 Feb 2007 16:57:20 GMT</pubDate></item></channel></rss>