<?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[Templates erben rekursiv von Spezialisierungen, was passiert genau?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ungefähr* diesen <a href="http://paste.pocoo.org/show/275436/" rel="nofollow">Code</a>.<br />
Beim Versuch, deu zu Übersetzen sagt mir g++ folgendes:</p>
<blockquote>
<p>ich@du:~/Documents$ g++ help.hpp<br />
help.hpp: In constructor ‘Mod&lt;T1, T2, T3, T4, T5&gt;::Mod(const std::string&amp;) [with T1 = A, T2 = B, T3 = C, T4 = empty, T5 = empty]’:<br />
help.hpp:58: instantiated from here<br />
help.hpp:48: error: no matching function for call to ‘Mod&lt;B, empty, empty, empty, empty&gt;::Mod()’<br />
help.hpp:35: note: candidates are: Mod&lt;T1, empty, empty, empty, empty&gt;::Mod(const std::string&amp;) [with T1 = B]<br />
help.hpp:44: note: Mod&lt;B, empty, empty, empty, empty&gt;::Mod(const Mod&lt;B, empty, empty, empty, empty&gt;&amp;)<br />
help.hpp:48: error: no matching function for call to ‘Mod&lt;C, empty, empty, empty, empty&gt;::Mod()’<br />
help.hpp:35: note: candidates are: Mod&lt;T1, empty, empty, empty, empty&gt;::Mod(const std::string&amp;) [with T1 = C]<br />
help.hpp:44: note: Mod&lt;C, empty, empty, empty, empty&gt;::Mod(const Mod&lt;C, empty, empty, empty, empty&gt;&amp;)</p>
</blockquote>
<p>Das passiert nicht, wenn ich das letzte typedef auf</p>
<pre><code class="language-cpp">typedef Mod&lt;A, B&gt; MyMod
</code></pre>
<p>ändere. Leider ist der Code nicht von mir und ich blicke nicht ganz durch.</p>
<p>So wie ich das sehe, wird ein parameterloser Konstruktor von einer Klasse ungleich Mod&lt; 5 x empty &gt; aufgerufen, was zu einem Fehler führt, du nur diese<br />
vollständige Spezialisierung einen besitzt. Allerdings kann ich beim besten Willen nicht ausmachen, warum das passiert: Der einzige Ort, wo so ein Konstruktor aufgerufen wird ist doch in Zeile 32 Mod&lt;&gt;(), aber Mod&lt;&gt; ist doch<br />
das gleiche wie Mod&lt; 5 x empty &gt;.</p>
<p>Kann mir einer erklären, was hier genau passiert?</p>
<p>-- Panke</p>
<p>* Ich habs natürlich aufs wichtigste Zusammengestrichen</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/275440/templates-erben-rekursiv-von-spezialisierungen-was-passiert-genau</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 22:21:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/275440.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 14 Oct 2010 15:30:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Templates erben rekursiv von Spezialisierungen, was passiert genau? on Thu, 14 Oct 2010 15:30:40 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ungefähr* diesen <a href="http://paste.pocoo.org/show/275436/" rel="nofollow">Code</a>.<br />
Beim Versuch, deu zu Übersetzen sagt mir g++ folgendes:</p>
<blockquote>
<p>ich@du:~/Documents$ g++ help.hpp<br />
help.hpp: In constructor ‘Mod&lt;T1, T2, T3, T4, T5&gt;::Mod(const std::string&amp;) [with T1 = A, T2 = B, T3 = C, T4 = empty, T5 = empty]’:<br />
help.hpp:58: instantiated from here<br />
help.hpp:48: error: no matching function for call to ‘Mod&lt;B, empty, empty, empty, empty&gt;::Mod()’<br />
help.hpp:35: note: candidates are: Mod&lt;T1, empty, empty, empty, empty&gt;::Mod(const std::string&amp;) [with T1 = B]<br />
help.hpp:44: note: Mod&lt;B, empty, empty, empty, empty&gt;::Mod(const Mod&lt;B, empty, empty, empty, empty&gt;&amp;)<br />
help.hpp:48: error: no matching function for call to ‘Mod&lt;C, empty, empty, empty, empty&gt;::Mod()’<br />
help.hpp:35: note: candidates are: Mod&lt;T1, empty, empty, empty, empty&gt;::Mod(const std::string&amp;) [with T1 = C]<br />
help.hpp:44: note: Mod&lt;C, empty, empty, empty, empty&gt;::Mod(const Mod&lt;C, empty, empty, empty, empty&gt;&amp;)</p>
</blockquote>
<p>Das passiert nicht, wenn ich das letzte typedef auf</p>
<pre><code class="language-cpp">typedef Mod&lt;A, B&gt; MyMod
</code></pre>
<p>ändere. Leider ist der Code nicht von mir und ich blicke nicht ganz durch.</p>
<p>So wie ich das sehe, wird ein parameterloser Konstruktor von einer Klasse ungleich Mod&lt; 5 x empty &gt; aufgerufen, was zu einem Fehler führt, du nur diese<br />
vollständige Spezialisierung einen besitzt. Allerdings kann ich beim besten Willen nicht ausmachen, warum das passiert: Der einzige Ort, wo so ein Konstruktor aufgerufen wird ist doch in Zeile 32 Mod&lt;&gt;(), aber Mod&lt;&gt; ist doch<br />
das gleiche wie Mod&lt; 5 x empty &gt;.</p>
<p>Kann mir einer erklären, was hier genau passiert?</p>
<p>-- Panke</p>
<p>* Ich habs natürlich aufs wichtigste Zusammengestrichen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1965648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1965648</guid><dc:creator><![CDATA[Panke]]></dc:creator><pubDate>Thu, 14 Oct 2010 15:30:40 GMT</pubDate></item><item><title><![CDATA[Reply to Templates erben rekursiv von Spezialisierungen, was passiert genau? on Fri, 15 Oct 2010 12:19:16 GMT]]></title><description><![CDATA[<p>Dein Problem dürfte durch eine reine public Vererbung nicht auftauchen.</p>
<pre><code class="language-cpp">class Mod : public Mod&lt;T1&gt;, public Mod&lt;T2, T3, T4, T5, empty&gt;
</code></pre>
<p>Ein Beispiel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;
template&lt;typename T1, typename T2&gt;
class Foo: public Foo&lt;T2, int&gt; //wenn hier virtual genutzt wird, so wird Foo&lt;int,int&gt;::Foo() aufgerufen
{
public:
	Foo(int i):Foo&lt;T2, int&gt;(4) {cout &lt;&lt; &quot;Foo&lt;T1,T2&gt;Foo(int i)\n&quot;;}
};
template &lt;&gt;
class Foo&lt;int, int&gt;
{
public:
	Foo() {cout &lt;&lt;&quot;Foo&lt;int, int&gt;::Foo()\n&quot;;} //wenn virtuelle-Vererbung
	Foo(int i) { cout &lt;&lt;&quot;Foo&lt;int, int&gt;Foo(int i)\n&quot;;} //ohne virtuelle Vererbung
};

int main()
{
	Foo&lt;int,char&gt; a(5);
}
</code></pre>
<p>Problem ist, dass durch virtual-Vererbung die, durch die Rekursion entstehende, Vererbungshierachie so verändert wird, dass der benutzerdefinierte Konstruktoraufruf (Foo&lt;int,int&gt;(4)) in der Initialisierungsliste von Foo&lt;char,int&gt;::Foo(int i) nicht sichtbar ist und damit nach einem Standardkonstruktor in Foo&lt;int,int&gt; gesucht wird</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966052</guid><dc:creator><![CDATA[einwurf]]></dc:creator><pubDate>Fri, 15 Oct 2010 12:19:16 GMT</pubDate></item><item><title><![CDATA[Reply to Templates erben rekursiv von Spezialisierungen, was passiert genau? on Sat, 16 Oct 2010 20:34:14 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>das funktioniert wunderbar, da wäre ich selbst nicht darauf gekommen.</p>
<p>Vielen, vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966555</guid><dc:creator><![CDATA[Panke]]></dc:creator><pubDate>Sat, 16 Oct 2010 20:34:14 GMT</pubDate></item></channel></rss>