<?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[Warum findet der Compiler beim Erben von Templates die Member nicht?]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgender Code, in dem eine Templateklasse von einer anderen Templateklasse erbt:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; class Base{
protected:
  int i;
};

template&lt;typename T&gt; class Richtig: public Base&lt;T&gt;{
public:
  void test(){++ Base&lt;T&gt;::i;}   // Alles richtig
};

template&lt;typename T&gt; class Falsch: public Base&lt;T&gt;{
public:
  void test(){++i;}            // i wird nicht gefunden
};
</code></pre>
<p>Warum werden die Member der Basisklasse nicht wie beim üblichen Vererben gefunden? Wenn die Kindklassen instanziert werden, ist die Basisklasse ja auch komplett gegeben. Und ich dachte, vor der Instanzierung wird gar kein Code für Templateklassen generiert, weil noch nicht bekannt ist, was als Templateparameter genommen werden soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/247730/warum-findet-der-compiler-beim-erben-von-templates-die-member-nicht</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 11:59:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/247730.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 14 Aug 2009 16:26:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Warum findet der Compiler beim Erben von Templates die Member nicht? on Fri, 14 Aug 2009 16:26:53 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgender Code, in dem eine Templateklasse von einer anderen Templateklasse erbt:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; class Base{
protected:
  int i;
};

template&lt;typename T&gt; class Richtig: public Base&lt;T&gt;{
public:
  void test(){++ Base&lt;T&gt;::i;}   // Alles richtig
};

template&lt;typename T&gt; class Falsch: public Base&lt;T&gt;{
public:
  void test(){++i;}            // i wird nicht gefunden
};
</code></pre>
<p>Warum werden die Member der Basisklasse nicht wie beim üblichen Vererben gefunden? Wenn die Kindklassen instanziert werden, ist die Basisklasse ja auch komplett gegeben. Und ich dachte, vor der Instanzierung wird gar kein Code für Templateklassen generiert, weil noch nicht bekannt ist, was als Templateparameter genommen werden soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1760907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1760907</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 14 Aug 2009 16:26:53 GMT</pubDate></item><item><title><![CDATA[Reply to Warum findet der Compiler beim Erben von Templates die Member nicht? on Fri, 14 Aug 2009 16:44:45 GMT]]></title><description><![CDATA[<p>Siehe: <a href="http://www.comeaucomputing.com/techtalk/templates/#whymembernotfound" rel="nofollow">http://www.comeaucomputing.com/techtalk/templates/#whymembernotfound</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1760917</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1760917</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Fri, 14 Aug 2009 16:44:45 GMT</pubDate></item><item><title><![CDATA[Reply to Warum findet der Compiler beim Erben von Templates die Member nicht? on Fri, 14 Aug 2009 16:49:58 GMT]]></title><description><![CDATA[<p>edit: Ok, hat also nichts mit Compiler zu tun.<br />
edit2: Beziehungsweise hat es doch, jetzt wo ich den verlinkten Text etwas weiter gelesen habe. Also gcc kann's nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1760924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1760924</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 14 Aug 2009 16:49:58 GMT</pubDate></item><item><title><![CDATA[Reply to Warum findet der Compiler beim Erben von Templates die Member nicht? on Fri, 14 Aug 2009 17:37:48 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>edit2: Beziehungsweise hat es doch, jetzt wo ich den verlinkten Text etwas weiter gelesen habe. Also gcc kann's nicht.</p>
</blockquote>
<p>&quot;gcc kann's nicht&quot; klingt so, als wäre es eine Schwäche. Es ist aber genau anders herum. Der GCC führt ein 2-Phasen-Lookup durch, wie es vom Standard verlangt wird und kann -- gerade weil er dies (absichtlich) macht -- Dir eine Fehlermeldung rausgeben. Das ist eine <em>gute</em> Sache, mit dem 2-Phasen-Lookup. Schreibe einfach</p>
<pre><code class="language-cpp">++this-&gt;i;
</code></pre>
<p>und alles ist i.O. Wenn Du &quot;i&quot; mit &quot;this-&gt;&quot; qualifizierst, dann wird die Namensauflösung von &quot;i&quot; bis zur zweiten Phase verzögert, weil die Basisklasse von einem Template-Parameter abhängt.</p>
<p>1. Phase = Parsen und Analyse des Templates<br />
2. Phase = Instanziieren eines Templates</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1760954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1760954</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Fri, 14 Aug 2009 17:37:48 GMT</pubDate></item><item><title><![CDATA[Reply to Warum findet der Compiler beim Erben von Templates die Member nicht? on Fri, 14 Aug 2009 18:57:18 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>&quot;gcc kann's nicht&quot; klingt so, als wäre es eine Schwäche.</p>
</blockquote>
<p>War so aber eigentlich gar nicht gemeint.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1760995</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1760995</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 14 Aug 2009 18:57:18 GMT</pubDate></item></channel></rss>