<?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[Verbung von typdefinitionen in Template-Klassen]]></title><description><![CDATA[<p>Hi,</p>
<p>warum geht das folgende nicht?</p>
<pre><code class="language-cpp">template &lt;class T&gt;	
class A { 	

  public:
    typedef T	my_internal_type;
    ...
    };

template &lt;class T&gt;	
class B : public A&lt;T&gt; { 	

  public:
    B(my_internal_type x) {..} 
    };
</code></pre>
<p>B kennt my_internal_type nicht - sollte B den nicht kennen <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="😕"
    /> ?<br />
Danke fuer Hinweise</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/170457/verbung-von-typdefinitionen-in-template-klassen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 02:45:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/170457.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 16 Jan 2007 11:27:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verbung von typdefinitionen in Template-Klassen on Tue, 16 Jan 2007 11:27:55 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>warum geht das folgende nicht?</p>
<pre><code class="language-cpp">template &lt;class T&gt;	
class A { 	

  public:
    typedef T	my_internal_type;
    ...
    };

template &lt;class T&gt;	
class B : public A&lt;T&gt; { 	

  public:
    B(my_internal_type x) {..} 
    };
</code></pre>
<p>B kennt my_internal_type nicht - sollte B den nicht kennen <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="😕"
    /> ?<br />
Danke fuer Hinweise</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1210648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1210648</guid><dc:creator><![CDATA[Vererber]]></dc:creator><pubDate>Tue, 16 Jan 2007 11:27:55 GMT</pubDate></item><item><title><![CDATA[Reply to Verbung von typdefinitionen in Template-Klassen on Tue, 16 Jan 2007 11:50:20 GMT]]></title><description><![CDATA[<p>Vererber schrieb:</p>
<blockquote>
<p>B kennt my_internal_type nicht - sollte B den nicht kennen <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="😕"
    /> ?</p>
</blockquote>
<p>Nein! B sollte die Typendefinition nicht kennen.</p>
<p>So gehts:</p>
<pre><code class="language-cpp">template &lt;class T&gt;    
class B : public A&lt;T&gt; {     
public: 
     typedef A&lt; T &gt;::my_internal_type my_internal_type;

     B(my_internal_type x) {..} 
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1210661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1210661</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Tue, 16 Jan 2007 11:50:20 GMT</pubDate></item><item><title><![CDATA[Reply to Verbung von typdefinitionen in Template-Klassen on Tue, 16 Jan 2007 11:58:18 GMT]]></title><description><![CDATA[<p>Hallo,<br />
das Problem ist das Selbe wie hier: <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-170395.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-170395.html</a></p>
<p>Nochmal kurz zusammengefasst:<br />
Ein standardkonformer Compiler versucht Templates so früh und soweit wie möglich zu prüfen. D.h. er versucht bereits die Definition des Templates zu checken, noch bevor das Template instanziiert wird. Da zu diesem Zeitpunkt allerdings noch nicht alle Informationen für einen vollständigen Check zur Verfügung stehen, teilt der Compiler die Template-Prüfung in zwei Phasen auf. In der ersten Phase (vor der Instanziierung) prüft der Compiler die generelle Syntax, sowie alle Namen, die nicht von einem Template-Parameter abhängig und somit also unabhängig von der konkreten Instanziierung sind (wichtig!). Die zweite Phase beginnt, wenn das Template instanziiert wird. In dieser Phase werden alle restlichen Namen geprüft.</p>
<p>Soviel als Einführung. Jetzt zu dem konkreten Problem: Normalerweise sieht eine abgeleitete Klasse alle Namen, die in ihren Basisklassen deklariert worden sind.</p>
<p>Ausnahme: Handelt es sich bei der Basisklasse um ein Template und ist dieses Template von mindestens einem Template-Parameter der abgeleiteten Klasse abhängig, so stehen die Namen der Basisklasse *nicht* implizit in abgeleiteten Klasse zur Verfügung.</p>
<p>Der Grund für diese Ausnahme ist das &quot;two-phase-lookup&quot;-Prinzip zusammen mit der Tatsache, dass Templates spezialisiert werden können.</p>
<p>Der Name my_internal_type ist so erstmal ein unabhängiger Name (d.h. so wie er da steht, kann man nicht erkennen, dass er von einem Template-Parameter abhängt). Nach den &quot;two-phase-lookup&quot;-Regeln muss dieser Name also bereits in der ersten Phase überprüft (und gebunden) werden. Angenommen es gäbe die oben erwähnte Ausnahme nicht und der Compiler könnte den Namen in der abhängigen Basisklasse nachschauen. In diesem Fall bekäme er ein Problem, falls verschiedene Spezialisierungen der Basisklasse dem Namen verschiedene Bedeutungen zuordnen:</p>
<pre><code class="language-cpp">template &lt;class T&gt;   
class A {    
public:
  typedef T my_internal_type;
};

template &lt;class T&gt;
class A&lt;T*&gt; {
public:
  typedef T my_internal_type;
};

template &lt;class T&gt;   
class B : public A&lt;T&gt; {    
public:
  // Ups! Was ist my_internal_type? -&gt; Keine Ahnung, abhängig von T!
  B(my_internal_type x) {..}
};
</code></pre>
<p>Um dieses Problem zu umgehen, wurde die oben erwähnte Ausnahme eingeführt. D.h. Namen wie my_internal_type werden *nicht* in abhängigen Basisklassen nachgeschaut, sondern nur im Scope der Klasse und in darüberliegenden Namespace-Scopes. Da es in diesen Scopes kein Element mit dem Namen my_internal_type gibt, beschwert sich der Compiler.</p>
<p>Die Lösung besteht darin, den Namen my_internal_type als abhängigen Namen zu markieren. Dazu gibt es prinzipiell zwei Möglichkeiten:<br />
a) Qualifikation mit der entsprechenden Basisklasse:</p>
<pre><code class="language-cpp">typename A&lt;T&gt;::my_internal_type
</code></pre>
<p>b) Qualifikation mit this (falls es sich um ein Member und nicht um einen Typ handelt)</p>
<pre><code class="language-cpp">this-&gt;foo();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1210674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1210674</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Tue, 16 Jan 2007 11:58:18 GMT</pubDate></item><item><title><![CDATA[Reply to Verbung von typdefinitionen in Template-Klassen on Tue, 16 Jan 2007 12:27:56 GMT]]></title><description><![CDATA[<p>HumeSikkins schrieb:</p>
<blockquote>
<p>...In der ersten Phase (vor der Instanziierung) prüft der Compiler die generelle Syntax, sowie alle Namen, die nicht von einem Template-Parameter abhängig ... sind ...</p>
<p>Die Lösung besteht darin, den Namen my_internal_type als abhängigen Namen zu markieren. ...<br />
b) Qualifikation mit this (falls es sich um ein Member und nicht um einen Typ handelt)</p>
<pre><code class="language-cpp">this-&gt;foo();
</code></pre>
</blockquote>
<p>Ist dieser Ausdruck denn &quot;Abhängig vom Template -Parameter&quot; ? Müsste in der Formulierun oben nicht noch &quot;abhängig von der Basisklasse&quot; dazu ? Ich meinte &quot;abhängiger Name&quot; bräuchte das ... oder habe ich das noch falsch verstanden ?</p>
<p>HumeSikkins schrieb:</p>
<blockquote>
<p>...<br />
...</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class A&lt;T*&gt; {
public:
  typedef T my_internal_type;
};
</code></pre>
<p>...</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Ich hatte mir noch nie Gedanken darüber gemacht, wie man bei Klassentemplates einen Zeiger-Template-Parameter angibt (bei Funktionstemplates ist es ja klar :))<br />
=&gt; Man lernt nie aus !</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1210713</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1210713</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 16 Jan 2007 12:27:56 GMT</pubDate></item><item><title><![CDATA[Reply to Verbung von typdefinitionen in Template-Klassen on Tue, 16 Jan 2007 12:43:36 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>HumeSikkins schrieb:</p>
<blockquote>
<p>...In der ersten Phase (vor der Instanziierung) prüft der Compiler die generelle Syntax, sowie alle Namen, die nicht von einem Template-Parameter abhängig ... sind ...</p>
<p>Die Lösung besteht darin, den Namen my_internal_type als abhängigen Namen zu markieren. ...<br />
b) Qualifikation mit this (falls es sich um ein Member und nicht um einen Typ handelt)</p>
<pre><code class="language-cpp">this-&gt;foo();
</code></pre>
</blockquote>
<p>Ist dieser Ausdruck denn &quot;Abhängig vom Template -Parameter&quot; ?</p>
</blockquote>
<p>Jup. Abhängigkeit ist transitiv. foo ist abhängig von this, this ist abhängig von T und damit ist foo abhängig von T. Ein zusätzliches &quot;abhängig von Basisklasse&quot; ist also nicht notwendig.</p>
<p>Anderes Beispiel:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
struct Base {
  void foo(T);
};

template &lt;class T&gt;
struct Derived : public Base&lt;T&gt; {
  void func() {
      T x;
      foo(x);
  }
};
</code></pre>
<p>Hier braucht man gar keine weitere Qualifizierung: x ist abhängig von T, foo ist abhängig von x, also ist foo abhängig von T und damit ein abhängiger Name.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1210729</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1210729</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Tue, 16 Jan 2007 12:43:36 GMT</pubDate></item><item><title><![CDATA[Reply to Verbung von typdefinitionen in Template-Klassen on Tue, 16 Jan 2007 13:00:20 GMT]]></title><description><![CDATA[<p>HumeSikkins schrieb:</p>
<blockquote>
<p>...<br />
Jup. Abhängigkeit ist transitiv.</p>
</blockquote>
<p>Das wusste ich wohl, für mich war allerdings die Frage, ob z.B. bei solchem nicht dasselbe gelten müsste:</p>
<pre><code class="language-cpp">struct Base {
   typedef int myType;
};

template &lt;class T&gt;
struct Derived : public Base {
   myType f();
};
</code></pre>
<p>Damit hätten wir zwar eine Abhängigkeit von der Basisklasse, aber keine (noch so indirekte) von T ...<br />
.. aber der gcc sagt mir gerade, dass dem nicht so ist (bzw. dass er damit kein Problem hat). Dann hatte ich das wohl auch mißverstanden.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1210735</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1210735</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 16 Jan 2007 13:00:20 GMT</pubDate></item><item><title><![CDATA[Reply to Verbung von typdefinitionen in Template-Klassen on Tue, 16 Jan 2007 13:46:27 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ups, da habe ich dich wohl heute zum zweiten Mal mißverstanden <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>&quot;Normale&quot; Basisklassen sind von der Ausnahme nicht betroffen, da deren Definition zum Zeitpunkt der Definition der abgeleiteten Klasse eindeutig bestimmt ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1210772</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1210772</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Tue, 16 Jan 2007 13:46:27 GMT</pubDate></item><item><title><![CDATA[Reply to Verbung von typdefinitionen in Template-Klassen on Tue, 16 Jan 2007 13:50:36 GMT]]></title><description><![CDATA[<p>Thx <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/1210779</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1210779</guid><dc:creator><![CDATA[Vererber]]></dc:creator><pubDate>Tue, 16 Jan 2007 13:50:36 GMT</pubDate></item></channel></rss>