<?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[eigenen Klassentyp als Template Parameter an einen Membertyp uebergeben..]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich habe da eine Frage zur Uebergabe des eigenen Klassen Typs als Template Parameter fuer den Typ einer Instanz eines Member. Ist sowas moeglich?</p>
<p>Also zB sowas wie..</p>
<pre><code class="language-cpp">template&lt; typename Arg1, typename Arg2 &gt;
class Foobar
{
private:
  SomeClass&lt; Foobar&lt; Arg1, Arg2 &gt; &gt; member;
//...
</code></pre>
<p>Das erinnert irgendwie an Vererbung einer Basisklasse von ihrer eigenen abgeleiteten Klasse, das ist ja afair auch nicht moeglich, oder geht das doch irgendwie?</p>
<p>...dabei beisst sich doch da die Katze auch irgendwie in den eigenen Schwanz, wenn damit wieder die Argumente uebergeben werden muessen und somit wieder ein &quot;SomeClass&quot; Member erzeugt werden wuerde, der wieder.. etc etc Oder gibt es da irgendwelche Einschraenkungen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/229495/eigenen-klassentyp-als-template-parameter-an-einen-membertyp-uebergeben</link><generator>RSS for Node</generator><lastBuildDate>Mon, 28 Sep 2026 00:33:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/229495.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 12 Dec 2008 15:31:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to eigenen Klassentyp als Template Parameter an einen Membertyp uebergeben.. on Fri, 12 Dec 2008 15:31:04 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich habe da eine Frage zur Uebergabe des eigenen Klassen Typs als Template Parameter fuer den Typ einer Instanz eines Member. Ist sowas moeglich?</p>
<p>Also zB sowas wie..</p>
<pre><code class="language-cpp">template&lt; typename Arg1, typename Arg2 &gt;
class Foobar
{
private:
  SomeClass&lt; Foobar&lt; Arg1, Arg2 &gt; &gt; member;
//...
</code></pre>
<p>Das erinnert irgendwie an Vererbung einer Basisklasse von ihrer eigenen abgeleiteten Klasse, das ist ja afair auch nicht moeglich, oder geht das doch irgendwie?</p>
<p>...dabei beisst sich doch da die Katze auch irgendwie in den eigenen Schwanz, wenn damit wieder die Argumente uebergeben werden muessen und somit wieder ein &quot;SomeClass&quot; Member erzeugt werden wuerde, der wieder.. etc etc Oder gibt es da irgendwelche Einschraenkungen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1629536</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1629536</guid><dc:creator><![CDATA[Fabeltier]]></dc:creator><pubDate>Fri, 12 Dec 2008 15:31:04 GMT</pubDate></item><item><title><![CDATA[Reply to eigenen Klassentyp als Template Parameter an einen Membertyp uebergeben.. on Fri, 12 Dec 2008 16:07:20 GMT]]></title><description><![CDATA[<p>naja du kannst SomeClass dann kein Member vom Typ seines Templateparameters geben, sonst macht der Compiler irgendwann die Grätsche. Aber möglich ists.<br />
Das gleiche problem entsteht natürlich wenn man auf die Weise eine &quot;Ringableitung&quot; macht:</p>
<pre><code class="language-cpp">template &lt;class T&gt; class Daddy; //forward-decl.

class B : public Daddy&lt;B&gt; 
{};

template &lt;class T&gt; 
class Daddy : public T 
{};
</code></pre>
<p>Aber es steht ja nirgendwo geschrieben, dass eine Templateklasse ihre Templateparameter als Member oder als Elternklasse haben muss oder? Es gibt z.B. häufig die Vererbung von class B im Beispiel. Wenn ein Klassentemplate dazu designt wurde, dass andere Klassen von der Templateklasse erben, die die Kindklasse als Templateparameter hat, dann nennt man das auch &quot;Curiously Recurring Template Pattern&quot;, ab und zu auch CRTP abgekürzt (zumindest hier im Forum)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1629557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1629557</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 12 Dec 2008 16:07:20 GMT</pubDate></item><item><title><![CDATA[Reply to eigenen Klassentyp als Template Parameter an einen Membertyp uebergeben.. on Fri, 12 Dec 2008 18:13:19 GMT]]></title><description><![CDATA[<p>Hmm, also ich hab das jetz mal versucht nachzubauen..</p>
<p>Aber bei mir kompiliert das nicht?! Seltsamerweise compiliert es, wenn ich statt zB &quot;Derived&quot; eine Dummy class implementiere und diese per Template Parameter uebergebe, also etwa so:</p>
<pre><code class="language-cpp">class Dummy[];
</code></pre>
<p>Hier also mein Code, versucht hab ich mit g++ 4.3.2:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

// forward declaration
template&lt; class T &gt; class Base;
class Derived;

// base class
template&lt; class T &gt; 
class Base 
  : public T
{
public:
  Base()
  {
    std::cout &lt;&lt; &quot;\t\tBase&lt; T &gt;::Base() - ctor\n&quot;;
  }
};

// Dummy
// class Dummy{};

// derived class
class Derived 
  : public Base&lt; Derived &gt; // hier statt &quot;Derived&quot; Dummy
{
public:
  Derived()
  {
    std::cout &lt;&lt; &quot;\tDerived::Derived() - ctor\n&quot;;
  }
};

/*
  main...
//*/
int main()
{
  using namespace std;

  cout &lt;&lt; &quot;instantiate..&quot;;
  Derived d;
  cout &lt;&lt; endl;

  cout &lt;&lt; &quot;READY.\n&quot;;
  return 0;
}
</code></pre>
<p>Die Fehlermeldung ist folgende (Zeilennummern stimmen mit oben ueberein <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>g++ -c -g -Wall crtp.cpp<br />
crtp.cpp: In instantiation of ‘Base&lt;Derived&gt;’:<br />
crtp.cpp:29: instantiated from here<br />
crtp.cpp:13: error: invalid use of incomplete type ‘class Derived’<br />
crtp.cpp:5: error: forward declaration of ‘class Derived’<br />
make: *** [crtp.o] Error 1</p>
</blockquote>
<p>..bin jetzt etwas verwirrt, sollte es denn normalerweise kompilieren? Was waere denn mein Output? Wenn ich ueberlegen wuerde, sollte es doch genauso verboten sein Template-ring-abhaengigkeiten zu erzeugen, wie bei Vererbungen?! <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1629612</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1629612</guid><dc:creator><![CDATA[Fabeltier]]></dc:creator><pubDate>Fri, 12 Dec 2008 18:13:19 GMT</pubDate></item><item><title><![CDATA[Reply to eigenen Klassentyp als Template Parameter an einen Membertyp uebergeben.. on Fri, 12 Dec 2008 18:22:17 GMT]]></title><description><![CDATA[<p>Du brauchst deine Klasse nicht vorwärts zu deklarieren (und darfst es offenbar auch nicht, ich hab das auf diese Art noch nie probiert, drum kenn ich da die genauen regeln nicht.) Die template-Klassen-Deklaration gibt dem Compiler nur ein Muster vor. Er macht daraus erst etwas anfassbares, wenn du da : public base&lt; Derived &gt; schreibst, aber an der Stelle ist der Typ Derived schon bekannt. Kein Problem also.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1629616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1629616</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 12 Dec 2008 18:22:17 GMT</pubDate></item><item><title><![CDATA[Reply to eigenen Klassentyp als Template Parameter an einen Membertyp uebergeben.. on Fri, 12 Dec 2008 18:26:31 GMT]]></title><description><![CDATA[<p>Ach in der Base leitest du wieder von der klasse Derived ab, dann. Das geht doch natürlich nicht. Derived leitet von Base&lt; Derived &gt; ab und Base&lt; Derived &gt; dann wieder von Derived. Irgendwie klingt das doch nach einem endlosen Kreis? <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/1629618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1629618</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 12 Dec 2008 18:26:31 GMT</pubDate></item><item><title><![CDATA[Reply to eigenen Klassentyp als Template Parameter an einen Membertyp uebergeben.. on Fri, 12 Dec 2008 18:29:18 GMT]]></title><description><![CDATA[<p>ich hab ja oben geschrieben, da macht der Compiler nicht mit <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1629622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1629622</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 12 Dec 2008 18:29:18 GMT</pubDate></item><item><title><![CDATA[Reply to eigenen Klassentyp als Template Parameter an einen Membertyp uebergeben.. on Fri, 12 Dec 2008 18:34:56 GMT]]></title><description><![CDATA[<p>Hab's gerade ohne Forward Deklaration versucht - selber Fehler, nur diesmal meckert er das die &quot;forward declaration&quot; in der Zeile der Definition von Derived.. nicht ganz stimmt.</p>
<p>Wie gesagt mit &quot;Dummy&quot; statt &quot;Derived&quot;, kompiliert der Spass, es scheint irgendwie an der Template Geschichte und dem Verhaeltnis von Base und Derived zu liegen, nur das der Compiler das so nicht sagt. Kann das sein??!!! <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>
<p>Edit:</p>
<p>pumuckl schrieb:</p>
<blockquote>
<p>ich hab ja oben geschrieben, da macht der Compiler nicht mit <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>okok.. aber nja, sagen koennte er das schon irgendwie, da sucht ja jeder nach nem Fehler mit Forward Deklaration..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1629625</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1629625</guid><dc:creator><![CDATA[Fabeltier]]></dc:creator><pubDate>Fri, 12 Dec 2008 18:34:56 GMT</pubDate></item><item><title><![CDATA[Reply to eigenen Klassentyp als Template Parameter an einen Membertyp uebergeben.. on Fri, 12 Dec 2008 18:34:49 GMT]]></title><description><![CDATA[<p>Das Vorwärtsdeklarieren war in diesem Fall gar kein Problem (In dem Fall, den ich zuerst angenommen hatte aber auch gar nicht nötig). Das Problem ist, dass der Compiler in eine Endlosschleife verfallen würde. Erwartest du, dass:</p>
<pre><code class="language-cpp">class B;

class A : public B {
};

class B : public A {
};
</code></pre>
<p>kompiliert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1629629</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1629629</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 12 Dec 2008 18:34:49 GMT</pubDate></item></channel></rss>