<?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[Template-Iterator]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich möchte gerne eine von <em>list</em> abgeleitete Template-Klasse <em>ilist</em> erstellen, die zusätzlichen einen passenden Iterator <em>it</em> enthält. Dazu verwende ich folgende Klassendefinition:</p>
<pre><code class="language-cpp">#include&lt;list&gt;
using namespace std;

template&lt;class T&gt;
class ilist: public list&lt;T&gt; {
  list&lt;T&gt;::iterator it;
};
</code></pre>
<p>Leider liefert mein Compilier (<em>gcc</em>) hierzu die wenig hilfreiche Fehlermeldung<br />
<em><a href="http://ilist.cc:6" rel="nofollow">ilist.cc:6</a>: error: expected ‘;’ before ‘it’</em>. Woran kann das liegen, bzw. wie mache ich es richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/175462/template-iterator</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 04:05:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/175462.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 10 Mar 2007 18:34:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template-Iterator on Sat, 10 Mar 2007 18:34:03 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich möchte gerne eine von <em>list</em> abgeleitete Template-Klasse <em>ilist</em> erstellen, die zusätzlichen einen passenden Iterator <em>it</em> enthält. Dazu verwende ich folgende Klassendefinition:</p>
<pre><code class="language-cpp">#include&lt;list&gt;
using namespace std;

template&lt;class T&gt;
class ilist: public list&lt;T&gt; {
  list&lt;T&gt;::iterator it;
};
</code></pre>
<p>Leider liefert mein Compilier (<em>gcc</em>) hierzu die wenig hilfreiche Fehlermeldung<br />
<em><a href="http://ilist.cc:6" rel="nofollow">ilist.cc:6</a>: error: expected ‘;’ before ‘it’</em>. Woran kann das liegen, bzw. wie mache ich es richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243038</guid><dc:creator><![CDATA[penpen]]></dc:creator><pubDate>Sat, 10 Mar 2007 18:34:03 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Iterator on Sat, 10 Mar 2007 18:36:55 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include&lt;list&gt;
using namespace std;

template&lt;class T&gt;
class ilist: public list&lt;T&gt; {
  typename list&lt;T&gt;::iterator it;
};
</code></pre>
<p>Der Typ von Iterator hängt vom Templateparameter T ab, darum musst du dem Compiler sagen, dass es ein Typ ist.<br />
Aber grundsätzlich ist es keine gute Idee von STL Containern zu erben, weil die keine virtuellen Destruktoren haben.<br />
Was brauchst du denn spezielles in der ilist, was std::list nicht hat?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243039</guid><dc:creator><![CDATA[THX 1138]]></dc:creator><pubDate>Sat, 10 Mar 2007 18:36:55 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Iterator on Sat, 10 Mar 2007 19:14:44 GMT]]></title><description><![CDATA[<p>Danke, so würde es also funktionieren!</p>
<p>Nun, die Idee dahinter ist folgende: Mein Programm verarbeitet eine DAG-Datenstruktur, wobei jeder <em>node</em> u.a. eine <em>list&lt;node</em>&gt;* von Nachfolgern hat, also in etwa so:</p>
<pre><code class="language-cpp">class node {
  irgendeintyp nutzdaten;
  list&lt;node*&gt; nachfolger;
</code></pre>
<p>Ich möchte nun der Reihe nach alle Pfade des DAGs erzeugen. Der zusätzliche <em>iterator</em> soll nun fürs explizite Backtracking jeweils den nächsten zu wählenden Nachfolger anzeigen. Da ich an der Wurzel des DAGs keinen einzelnen <em>node</em>, sondern eine <em>list&lt;node</em>&gt;* habe, möchte ich den <em>iterator</em> konsequenterweise in der <em>list&lt;node</em>&gt;* unterbringen (und nicht etwa in den <em>node</em>s).</p>
<p>Du würdest mir aber eher davon abraten? Könntest Du mir bitte genauer erklären, welche Probleme durch das Fehlen der virtuellen Destruktoren entstehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243061</guid><dc:creator><![CDATA[penpen]]></dc:creator><pubDate>Sat, 10 Mar 2007 19:14:44 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Iterator on Sat, 10 Mar 2007 19:34:16 GMT]]></title><description><![CDATA[<p>Das gibt Memory Leaks. Die Objekte der abgeleiteten Klassen werden<br />
nicht zerstört.<br />
Mach dir einfach 2 Klassen Base und Derive. Leite Derive von Base ab.<br />
Beim ersten Test machst du die Destruktoren nicht virtuell, erzeugst<br />
die Objekte und gibst den Speicher wieder frei. Beim zweiten Test<br />
die Destruktoren virtuell machen. Mach eine Ausgabe in die Destruktoren<br />
von Base und Derive oder setz einen Breakpoint rein, damit du siehst<br />
ob und in welcher Reihenfolge die Destruktoren durchlaufen werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243067</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243067</guid><dc:creator><![CDATA[schokomann]]></dc:creator><pubDate>Sat, 10 Mar 2007 19:34:16 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Iterator on Sat, 10 Mar 2007 20:50:35 GMT]]></title><description><![CDATA[<p>OK, danke für den Tipp!</p>
<p>Wenn ich nun also die fragliche Definition</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class ilist: public list&lt;T&gt; {
  typename list&lt;T&gt;::iterator it;
};
</code></pre>
<p>verwende, und später z.B.</p>
<pre><code class="language-cpp">list&lt;int&gt;* x = new ilist&lt;int&gt;();
</code></pre>
<p>mache, dann wird bei Freigabe mit</p>
<pre><code class="language-cpp">delete x;
</code></pre>
<p>der Destruktor von <em>list&lt;int&gt;</em> aufgerufen, nicht aber der von <em>ilist&lt;int&gt;</em>.</p>
<p>Das ist nicht schön, in meinem Fall aber auch nicht wirklich schlimm, da ich für <em>ilist&lt;T&gt;</em> ohnehin keine zusätzlichen Aufräumaktionen benötigen werde.</p>
<p>Trotzdem gut zu wissen, was hier schiefgehen kann!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243103</guid><dc:creator><![CDATA[penpen]]></dc:creator><pubDate>Sat, 10 Mar 2007 20:50:35 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Iterator on Sat, 10 Mar 2007 21:27:39 GMT]]></title><description><![CDATA[<p>penpen schrieb:</p>
<blockquote>
<p>dann wird bei Freigabe mit</p>
<pre><code class="language-cpp">delete x;
</code></pre>
<p>der Destruktor von <em>list&lt;int&gt;</em> aufgerufen, nicht aber der von <em>ilist&lt;int&gt;</em>.</p>
</blockquote>
<p>Logisch, der Destruktor von 'list' ist nicht virtuell gemacht.</p>
<p>=&gt; <strong>Standardcontainer eignen sich nicht für Vererbung!</strong></p>
<p>(Oder zumindest nicht als Basis polymorpher Objekthierarchien.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243118</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sat, 10 Mar 2007 21:27:39 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Iterator on Sun, 11 Mar 2007 11:23:48 GMT]]></title><description><![CDATA[<p>Das ist doch schonmal ein guter Ansatz. Ich würde nicht von Liste erben, sondern diese als Member anlegen.</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class node {
  irgendeintyp nutzdaten;
  typename list&lt;node&lt;T&gt;*&gt; nachfolger;
  typename list&lt;node&lt;T&gt;*&gt;::iterator nachfolge_iter;
  nachfolge_iter erster()
 {
    return nachfolger.begin();
  }
};
</code></pre>
<p>So mal als erste Idee, ist jetzt nicht getestet oder ausgereift.</p>
<p>Nun zu deinem Problem. Du möchtest Graphen abbilden richtig?<br />
Schau dir die <a href="http://www.boost.org/libs/graph/doc/index.html" rel="nofollow">Boost Graph Library</a> an, die ist sehr ähnlich aufgebaut wie die STL und bietet &quot;Container&quot; für Graphen (Adjazenz Liste und Matrix) sowie diverse Algorithmen und ...trrr...trommelwirbel... Iteratoren!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243253</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243253</guid><dc:creator><![CDATA[THX 1138]]></dc:creator><pubDate>Sun, 11 Mar 2007 11:23:48 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Iterator on Mon, 12 Mar 2007 09:56:16 GMT]]></title><description><![CDATA[<p>THX 1138 schrieb:</p>
<blockquote>
<p>Das ist doch schonmal ein guter Ansatz. Ich würde nicht von Liste erben, sondern diese als Member anlegen.</p>
</blockquote>
<p>Hätte ich auch getan, falls ich immer mit Knoten arbeiten würde. Nur ist der Einstiegspunkt in meine Datenstruktur eben kein einzelner Knoten, sondern eine Liste von Knoten. Es gibt in dem Graphen eben keine einzelne Wurzel, sondern mehrere Starknoten. Deshalb die Idee, den Iterator in den Listen unterzubringen.</p>
<p>Ein Workaround wäre natürlich, einen Wurzelknoten mit Dummy-Daten einzuführen. Den Vererbungs-Ansatz finde ich aber eleganter.</p>
<p>THX 1138 schrieb:</p>
<blockquote>
<p>Nun zu deinem Problem. Du möchtest Graphen abbilden richtig?<br />
Schau dir die <a href="http://www.boost.org/libs/graph/doc/index.html" rel="nofollow">Boost Graph Library</a> an, die ist sehr ähnlich aufgebaut wie die STL und bietet &quot;Container&quot; für Graphen (Adjazenz Liste und Matrix) sowie diverse Algorithmen und ...trrr...trommelwirbel... Iteratoren!</p>
</blockquote>
<p>Sieht sehr nützlich aus, vor allem eben für ganz allgemeine Graphen. Bis jetzt funktioniert mein Ansatz sehr gut, werde mir die Library aber auf jeden Fall merken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243820</guid><dc:creator><![CDATA[penpen]]></dc:creator><pubDate>Mon, 12 Mar 2007 09:56:16 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Iterator on Mon, 12 Mar 2007 20:20:40 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template &lt;class T&gt; class dingsi
{
public:
    std::list&lt;T&gt; m_list;
    typename std::list&lt;T&gt;::iterator m_backTrackingIteratorDingsDongsLala;
};
</code></pre>
<p>Blubb?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1244314</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244314</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 12 Mar 2007 20:20:40 GMT</pubDate></item></channel></rss>