<?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-Klassen-Vererbungs-Fehler]]></title><description><![CDATA[<p>Moin,</p>
<p>das ist wahrscheinlich der komplizierteste Beitrag im ganzen Forum... <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>Also ich habe folgenden Code:</p>
<pre><code class="language-cpp">#include &lt;list&gt;

template &lt;class T_TYPE&gt;
class A
{
        class A_Entry {
                //...
        };
        std::list&lt;A_Entry*&gt; my_list;
        //std::list&lt;A_Entry*&gt;::iterator my_list_itr;
};
</code></pre>
<p>Geht soweit. Wenn ich nun das Kommentarzeichen wegnehme, kommt der Error:</p>
<pre><code>derived.cpp:28: error: type ‘std::list&lt;A&lt;T_TYPE&gt;::A_Entry*, std::allocator&lt;A&lt;T_TYPE&gt;::A_Entry*&gt; &gt;’ is not derived from type ‘A&lt;T_TYPE&gt;’
</code></pre>
<p>(gcc version 4.2.1 (SUSE Linux))</p>
<p>Ich verstehe den Error überhaupt nicht. Nehme ich die Zeile &quot;template &lt;class T_TYPE&gt;&quot; heraus (also so, dass die Klasse keine Template-Klasse mehr ist), geht alles wunderbar. Liegt also an dem Template. Aber wieso kann ich eine Liste, aber keinen zugehörigen Iterator deklarieren?</p>
<p>Vielen Dank für Eure Hilfe im Voraus!<br />
voidpointer</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/221546/template-klassen-vererbungs-fehler</link><generator>RSS for Node</generator><lastBuildDate>Tue, 06 Oct 2026 00:43:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/221546.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 31 Aug 2008 11:31:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template-Klassen-Vererbungs-Fehler on Sun, 31 Aug 2008 11:31:02 GMT]]></title><description><![CDATA[<p>Moin,</p>
<p>das ist wahrscheinlich der komplizierteste Beitrag im ganzen Forum... <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>Also ich habe folgenden Code:</p>
<pre><code class="language-cpp">#include &lt;list&gt;

template &lt;class T_TYPE&gt;
class A
{
        class A_Entry {
                //...
        };
        std::list&lt;A_Entry*&gt; my_list;
        //std::list&lt;A_Entry*&gt;::iterator my_list_itr;
};
</code></pre>
<p>Geht soweit. Wenn ich nun das Kommentarzeichen wegnehme, kommt der Error:</p>
<pre><code>derived.cpp:28: error: type ‘std::list&lt;A&lt;T_TYPE&gt;::A_Entry*, std::allocator&lt;A&lt;T_TYPE&gt;::A_Entry*&gt; &gt;’ is not derived from type ‘A&lt;T_TYPE&gt;’
</code></pre>
<p>(gcc version 4.2.1 (SUSE Linux))</p>
<p>Ich verstehe den Error überhaupt nicht. Nehme ich die Zeile &quot;template &lt;class T_TYPE&gt;&quot; heraus (also so, dass die Klasse keine Template-Klasse mehr ist), geht alles wunderbar. Liegt also an dem Template. Aber wieso kann ich eine Liste, aber keinen zugehörigen Iterator deklarieren?</p>
<p>Vielen Dank für Eure Hilfe im Voraus!<br />
voidpointer</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1574207</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1574207</guid><dc:creator><![CDATA[voidpointer]]></dc:creator><pubDate>Sun, 31 Aug 2008 11:31:02 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Klassen-Vererbungs-Fehler on Sun, 31 Aug 2008 12:09:47 GMT]]></title><description><![CDATA[<p>voidpointer schrieb:</p>
<blockquote>
<p>das ist wahrscheinlich der komplizierteste Beitrag im ganzen Forum... <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>
</blockquote>
<p>Nein. Eigentlich trivial.</p>
<p>voidpointer schrieb:</p>
<blockquote>
<p>Ich verstehe den Error überhaupt nicht. Nehme ich die Zeile &quot;template &lt;class T_TYPE&gt;&quot; heraus (also so, dass die Klasse keine Template-Klasse mehr ist), geht alles wunderbar. Liegt also an dem Template. Aber wieso kann ich eine Liste, aber keinen zugehörigen Iterator deklarieren?</p>
</blockquote>
<p>Ganz einfach: Woher soll der Compiler wissen, was er da für einen Typ vor sich hat? <code>iterator</code> könnte genauso gut eine Membervariable sein. Darum brauchst du das Schlüsselwort <code>typename</code> .</p>
<pre><code class="language-cpp">#include &lt;list&gt;

template &lt;class T_TYPE&gt;
class A
{
        class A_Entry {
                //...
        };  
        std::list&lt;A_Entry*&gt; my_list;
        typename std::list&lt;A_Entry*&gt;::iterator my_list_itr;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1574212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1574212</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 31 Aug 2008 12:09:47 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Klassen-Vererbungs-Fehler on Sun, 31 Aug 2008 12:46:30 GMT]]></title><description><![CDATA[<p>Tut mir leid, verstehe das nicht ganz oO</p>
<p>Kenne das Wort typename eigtl. nur von Templates:</p>
<p>template&lt;typename T&gt; func() ...</p>
<p>Hat das dann hier eine neue Bedeutung?</p>
<p>Und: warum könnte iterator auch eine Membervariable sein? Ist das Problem, dass der Iterator wissen muss, worauf er zeigt, während das die Liste nicht wissen brauch? Im Grunde genommen ist es für die Liste doch auch relevant, oder nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1574219</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1574219</guid><dc:creator><![CDATA[voidpointer]]></dc:creator><pubDate>Sun, 31 Aug 2008 12:46:30 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Klassen-Vererbungs-Fehler on Sun, 31 Aug 2008 12:55:33 GMT]]></title><description><![CDATA[<p>::iterator könnte auch eine statische variable von list sein... damit der compiler weis dass es sich um einen typ handelt muss man typename mit angeben...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1574227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1574227</guid><dc:creator><![CDATA[hmmmm]]></dc:creator><pubDate>Sun, 31 Aug 2008 12:55:33 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Klassen-Vererbungs-Fehler on Sun, 31 Aug 2008 12:55:50 GMT]]></title><description><![CDATA[<p>voidpointer schrieb:</p>
<blockquote>
<p>Tut mir leid, verstehe das nicht ganz oO</p>
<p>Kenne das Wort typename eigtl. nur von Templates:</p>
<p>template&lt;typename T&gt; func() ...</p>
<p>Hat das dann hier eine neue Bedeutung?</p>
<p>Und: warum könnte iterator auch eine Membervariable sein? Ist das Problem, dass der Iterator wissen muss, worauf er zeigt, während das die Liste nicht wissen brauch? Im Grunde genommen ist es für die Liste doch auch relevant, oder nicht?</p>
</blockquote>
<p>Das hat direkt nichts damit zu tun.</p>
<pre><code class="language-cpp">std::list&lt;A_Entry*&gt;::iterator
</code></pre>
<p>Könnte z.B das bedeuten:</p>
<pre><code class="language-cpp">namespace std
{
 template &lt;class T&gt;
 class list
{
int iterator;
};
}
</code></pre>
<p>oder auch das:</p>
<pre><code class="language-cpp">namespace std
{
 template &lt;class T&gt;
 class list
{
typedef int* iterator;
};
}
</code></pre>
<p>Und das kann der Compiler nicht auseinanderhalten. Er nimmt Standardmässig an, dass es sich <strong>nicht</strong> um einen Typen handelt, ausser du sagst es ihm mittels typename.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1574228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1574228</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 31 Aug 2008 12:55:50 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Klassen-Vererbungs-Fehler on Sun, 31 Aug 2008 13:00:48 GMT]]></title><description><![CDATA[<p>voidpointer schrieb:</p>
<blockquote>
<p>Tut mir leid, verstehe das nicht ganz oO</p>
</blockquote>
<p>Dann schlag mal in deinem C++-Buch nach. <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>voidpointer schrieb:</p>
<blockquote>
<p>Hat das dann hier eine neue Bedeutung?</p>
</blockquote>
<p>Kommt drauf an. An welche Bedeutung hast du denn gedacht? Es bedeutet: &quot;Achtung das was danach kommt, ist ein Typbezeichner&quot;</p>
<p>voidpointer schrieb:</p>
<blockquote>
<p>Und: warum könnte iterator auch eine Membervariable sein? Ist das Problem, dass der Iterator wissen muss, worauf er zeigt, während das die Liste nicht wissen brauch? Im Grunde genommen ist es für die Liste doch auch relevant, oder nicht?</p>
</blockquote>
<p>Nicht der <code>iterator</code> selber, sondern der Bezeichner.</p>
<p>Nimm folgendes Beispiel:</p>
<pre><code class="language-cpp">struct A {
   typedef int x;
}

struct B {
  static int x;
}
int B::x = 42;

template &lt;typename T&gt;
struct TPL1 {
  typename T::x variable;
}

template &lt;typename T&gt;
struct TPL2 {
  void foo() {
    T::x = 5;
  }
}
</code></pre>
<p>Bei dem <code>T::x</code> ist nicht klaar, ob es sich jetzt um eine Variable, oder um einen Typ handelt. Und damit der Compiler einen Syntax-Check durchführen kann, geht er davon aus, es ist eine Variable. Willst du, dass <code>T::x</code> ein Typ ist, dann muss ein <code>typename</code> davor.</p>
<p>Edit: Hmm... zu langsam <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1574230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1574230</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 31 Aug 2008 13:00:48 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Klassen-Vererbungs-Fehler on Mon, 01 Sep 2008 13:41:52 GMT]]></title><description><![CDATA[<p>Ok, vielen Dank soweit! Ich denke, ich habe es verstanden. Mein C++-Buch hat über 800 Seiten aber das stand da nicht.</p>
<p>Könnte man das typename noch mit Hilfe von Typedefs für Iteratoren weglassen? Mein Compiler akzeptiert das:</p>
<pre><code class="language-cpp">typedef typename list&lt;A_Entry*&gt;::iterator iterator;
</code></pre>
<p>Ist das so ok? Und ist der Name &quot;iterator&quot; ungünstig, da es in manchen Fällen zu problemen kommen könnte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1574769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1574769</guid><dc:creator><![CDATA[voidpointer]]></dc:creator><pubDate>Mon, 01 Sep 2008 13:41:52 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Klassen-Vererbungs-Fehler on Mon, 01 Sep 2008 13:54:08 GMT]]></title><description><![CDATA[<p>voidpointer schrieb:</p>
<blockquote>
<p>Ok, vielen Dank soweit! Ich denke, ich habe es verstanden. Mein C++-Buch hat über 800 Seiten aber das stand da nicht.</p>
<p>Könnte man das typename noch mit Hilfe von Typedefs für Iteratoren weglassen? Mein Compiler akzeptiert das:</p>
<pre><code class="language-cpp">typedef typename list&lt;A_Entry*&gt;::iterator iterator;
</code></pre>
<p>Ist das so ok? Und ist der Name &quot;iterator&quot; ungünstig, da es in manchen Fällen zu problemen kommen könnte?</p>
</blockquote>
<p>Das ist so OK. Wegen den Namen musst du hald selber wissen. Ich persönliche einen spezielleren Namen, der auf den Zweck des Containers hinweist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1574783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1574783</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 01 Sep 2008 13:54:08 GMT</pubDate></item></channel></rss>