<?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[Erben von einem Template]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Template definiert, das ungefähr so aussieht:</p>
<pre><code class="language-cpp">template &lt;class T&gt; class MyTemplate
{
public:
  MyTemplate(const UINT zahl);
  /* ... */
};
</code></pre>
<p>Jetzt würde ich gerne von diesem Template eine Klasse ableiten. Eigentlich soll da aber keine weitere Funktionalität hinzukommen. Ich benötige eigentlich nur einen Platzhalter:</p>
<pre><code class="language-cpp">class MyClass : public MyTemplate&lt;MyType&gt;
{
};
</code></pre>
<p>Wenn ich diese Klasse jetzt aber durch</p>
<pre><code class="language-cpp">MyClass my( 2 );
</code></pre>
<p>zu benutzen versuche, bekomme ich die Fehlermeldung</p>
<pre><code>'MyClass::MyClass': function does not take 1 parameter
</code></pre>
<p>Was habe ich vergessen? Konstruktor für MyClass schreiben? Aber wie gebe ich dann den Parameter zahl an die Basisklasse weiter?</p>
<p>Dankbar für jede Hilfe. Viele Grüße.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/187892/erben-von-einem-template</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 21:59:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/187892.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 25 Jul 2007 10:06:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Erben von einem Template on Wed, 25 Jul 2007 10:06:07 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Template definiert, das ungefähr so aussieht:</p>
<pre><code class="language-cpp">template &lt;class T&gt; class MyTemplate
{
public:
  MyTemplate(const UINT zahl);
  /* ... */
};
</code></pre>
<p>Jetzt würde ich gerne von diesem Template eine Klasse ableiten. Eigentlich soll da aber keine weitere Funktionalität hinzukommen. Ich benötige eigentlich nur einen Platzhalter:</p>
<pre><code class="language-cpp">class MyClass : public MyTemplate&lt;MyType&gt;
{
};
</code></pre>
<p>Wenn ich diese Klasse jetzt aber durch</p>
<pre><code class="language-cpp">MyClass my( 2 );
</code></pre>
<p>zu benutzen versuche, bekomme ich die Fehlermeldung</p>
<pre><code>'MyClass::MyClass': function does not take 1 parameter
</code></pre>
<p>Was habe ich vergessen? Konstruktor für MyClass schreiben? Aber wie gebe ich dann den Parameter zahl an die Basisklasse weiter?</p>
<p>Dankbar für jede Hilfe. Viele Grüße.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1332132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1332132</guid><dc:creator><![CDATA[mbu]]></dc:creator><pubDate>Wed, 25 Jul 2007 10:06:07 GMT</pubDate></item><item><title><![CDATA[Reply to Erben von einem Template on Wed, 25 Jul 2007 10:15:52 GMT]]></title><description><![CDATA[<p>Indem du die Basisklasse ueber die initialisiererliste initialisierst:</p>
<pre><code class="language-cpp">class MyClass : public MyTemplate&lt;MyType&gt;
{
public:
  MyClass(const UINT zahl) : MyTemplate&lt;MyType&gt;(zahl) {}
};

int main()
 {
  MyClass my( 2 ); 	
 }
</code></pre>
<p>Oder indem du das mit dem Ableiten vergisst und einfach einen typedef benutzt (wenn du wirklich nur einen Platzhalter brauchst)</p>
<pre><code class="language-cpp">typedef MyTemplate&lt;MyType&gt; MyClass;

int main()
 {
  MyClass my( 2 ); 	// gleibedeutend mit MyTemplate&lt;MyClass&gt; my(2);
 }
</code></pre>
<p>Das pure Ableiten ohne weiteres das du oben praktiziert hast, gibt folgenden Effekt:</p>
<ol>
<li>Da du keinen Konstruktor fuer die neue Klasse angegeben hast, wird ein Defaultkonstruktor generiert, der im Grunde nichts macht als wiederum die Defaultkonstruktoren fuer alle Basisklassen und Memberklassen auzurufen.</li>
<li>Da aber deine Basisklasse nur der UINT-Konstruktor und keinen Defaultkonstruktor hat, weiss der Compiler nicht, wie er die Basis von MyClass initialisieren soll und gibt dir auf jeden Fall eine Fehlermeldung.</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1332139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1332139</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 25 Jul 2007 10:15:52 GMT</pubDate></item><item><title><![CDATA[Reply to Erben von einem Template on Wed, 25 Jul 2007 10:10:54 GMT]]></title><description><![CDATA[<p>mbu schrieb:</p>
<blockquote>
<p>Was habe ich vergessen? Konstruktor für MyClass schreiben?</p>
</blockquote>
<p>Genau das fehlt.</p>
<blockquote>
<p>Aber wie gebe ich dann den Parameter zahl an die Basisklasse weiter?</p>
</blockquote>
<p>Über eine Initialisierungsliste:</p>
<pre><code class="language-cpp">class MyClass : public MyTemplate&lt;MyType&gt;
{
public:
  MyClass(UINT zahl):MyTemplate&lt;MyType&gt;(zahl){}
};
</code></pre>
<p>(btw, das 'const' in der Parameterliste ist unnötig ;))</p>
<p>PS: Wenn du nur einen Platzhalter brauchst, mußt du nichtmal erben - <code>typedef MyTemplate&lt;MyType&gt; MyClass;</code> reicht meistens aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1332140</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1332140</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 25 Jul 2007 10:10:54 GMT</pubDate></item><item><title><![CDATA[Reply to Erben von einem Template on Wed, 25 Jul 2007 10:21:54 GMT]]></title><description><![CDATA[<p>Ach natürlich. Ein typedef macht natürlich Sinn. Vielen Dank erstmal für den Tipp.</p>
<p>Hintergrund hierfür ist, dass ich für das Template den &lt;&lt; Operator überschrieben habe:</p>
<pre><code class="language-cpp">template &lt;class T&gt; std::ostream&amp; operator&lt;&lt;(std::ostream&amp; out, const MyTemplate&lt;T&gt;&amp; my)
{
  /* .. */
}
</code></pre>
<p>Ich möchte aber für einen bestimmten Typ T eine etwas abgewandelte Ausgabe haben. Jetzt strauchel ich mit dem typedef aber leider über die Redefinition von &lt;&lt;:</p>
<pre><code class="language-cpp">typedef MyTemplate&lt;MyType&gt; MyClass;

/* .. */

std::ostream&amp; operator&lt;&lt;(std::ostream&amp; out, const MyClass&amp; myc)
{
  /* .. */
}
</code></pre>
<p>Führt nämlich leider zu einem Linkerfehler.</p>
<blockquote>
<p>LNK2005: ... already defined in class.obj<br />
LNK1169: ... one or more multiply defines symbols found</p>
</blockquote>
<p>Geht das Überschreiben des &lt;&lt; Operators so nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1332146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1332146</guid><dc:creator><![CDATA[mbu]]></dc:creator><pubDate>Wed, 25 Jul 2007 10:21:54 GMT</pubDate></item><item><title><![CDATA[Reply to Erben von einem Template on Wed, 25 Jul 2007 10:34:13 GMT]]></title><description><![CDATA[<p>Hat sich inzwischen erledigt. Ich habe es hinbekommen. Das Linkerproblem bestand nur in meiner Aufteilung von .h und .cpp Dateien. Bin da etwas durcheinander gekommen.</p>
<p>Vielen Dank trotzdem für die schnelle Hilfe!!</p>
<p>Gruss. mbu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1332149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1332149</guid><dc:creator><![CDATA[mbu]]></dc:creator><pubDate>Wed, 25 Jul 2007 10:34:13 GMT</pubDate></item><item><title><![CDATA[Reply to Erben von einem Template on Wed, 25 Jul 2007 11:49:24 GMT]]></title><description><![CDATA[<p>Du kannst auch - voellig ohne typedef und Ableitung - das Funktionstemplate vollstaendig spezialisieren.</p>
<pre><code class="language-cpp">template &lt;class T&gt;
std::ostream&amp; operator&lt;&lt;(std::ostream&amp; out, const MyTemplate&lt;T&gt;&amp; my);
</code></pre>
<p>ist ein Funktionstemplate und gleichzeitig eine Ueberladung der bereits bestehenden Funktionen mit Namen operator&lt;&lt;</p>
<p>Deine zweite Definition ist eine weitere Ueberladung des Operatoers, statt dessen kannst du auch das bereits bestehende Template spezialisieren, da die Ausgabe von MyTemplate&lt;MyType&gt; ja tatsaechlich auch ein SPezialfall dieses Templates ist:</p>
<pre><code class="language-cpp">template&lt;&gt; 
std::ostream operator&lt;&lt; &lt;MyType&gt; (std::ostream&amp; out, const MyTemplate&lt;MyType&gt;&amp; my);
</code></pre>
<p>Das &lt;MyType&gt; hinter operator&lt;&lt; kann in diesem Fall auch weggelassen werden, da der Compiler in der Lage ist, den Templateparameter aus den Funktionsargumenten abzuleiten. Ich hab keine Ahnung ob template-Spezialisierung in schnellerem Code resultiert als die Operator-Ueberladung, allerdings drueckt sie die Zugehoerigkeit zum template inmeinen Augen besser aus als eine weitere Operatorueberladung - pure aesthetik also <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1332219</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1332219</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 25 Jul 2007 11:49:24 GMT</pubDate></item></channel></rss>