<?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[Template-Spezialisierung nicht möglich]]></title><description><![CDATA[<p>Huhu,</p>
<p>Wieso ist das folgende eigentlich nicht erlaubt?</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
	struct valdef
	{
		typedef T value;
	};

	template &lt;typename&gt;
	struct pop_back;

	template &lt;digit... Head, digit Tail&gt;
	struct pop_back&lt;bigint&lt;Head..., Tail&gt;&gt;
		: valdef&lt;bigint&lt;Head...&gt;&gt;
	{};
</code></pre>
<p>=&gt;</p>
<blockquote>
<p>../main.cpp:6:10: error: 'value' in 'struct tmp::pop_back&lt;tmp::bigint&lt;5u, 6u, 7u&gt; &gt;' does not name a type</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/topic/303343/template-spezialisierung-nicht-möglich</link><generator>RSS for Node</generator><lastBuildDate>Mon, 10 Aug 2026 11:57:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/303343.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 11 May 2012 09:06:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template-Spezialisierung nicht möglich on Fri, 11 May 2012 09:16:28 GMT]]></title><description><![CDATA[<p>Huhu,</p>
<p>Wieso ist das folgende eigentlich nicht erlaubt?</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
	struct valdef
	{
		typedef T value;
	};

	template &lt;typename&gt;
	struct pop_back;

	template &lt;digit... Head, digit Tail&gt;
	struct pop_back&lt;bigint&lt;Head..., Tail&gt;&gt;
		: valdef&lt;bigint&lt;Head...&gt;&gt;
	{};
</code></pre>
<p>=&gt;</p>
<blockquote>
<p>../main.cpp:6:10: error: 'value' in 'struct tmp::pop_back&lt;tmp::bigint&lt;5u, 6u, 7u&gt; &gt;' does not name a type</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2210451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210451</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 11 May 2012 09:16:28 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung nicht möglich on Fri, 11 May 2012 10:00:42 GMT]]></title><description><![CDATA[<p>Gibt es ein komplettes Minimalbeispiel? Duerfen denn nach ... noch weitere Argumente folgen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210469</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 11 May 2012 10:00:42 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung nicht möglich on Fri, 11 May 2012 10:12:58 GMT]]></title><description><![CDATA[<p>Was ist denn unklar? Angenommen ich habe einen bigint&lt;1, 2, 3&gt;, dann soll das Ergebnis ein bigint&lt;1, 2&gt; sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210483</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 11 May 2012 10:12:58 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung nicht möglich on Fri, 11 May 2012 10:18:05 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Was ist denn unklar? Angenommen ich habe einen bigint&lt;1, 2, 3&gt;, dann soll das Ergebnis ein bigint&lt;1, 2&gt; sein.</p>
</blockquote>
<p>Wenn der Fehler ist, dass eine Typenbezeichnung ungültig ist, wäre es sehr nützlich, alle Typen genau zu kennen. Außerdem möchte man so etwas gerne mal selber ausprobieren und eine Korrektur ausprobieren, bevor man eine vermeintlich falsche Antwort gibt. Allein durch Draufstarren beantwortet niemand solche Fragen. Man fragt sich dann bloß ständig, was nun digit und bigint genau sind und ob der Fehler vielleicht dort liegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210484</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 11 May 2012 10:18:05 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung nicht möglich on Fri, 11 May 2012 10:18:39 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">typedef unsigned char digit;

	template &lt;digit...&gt;
	struct bigint
	{};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2210485</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210485</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 11 May 2012 10:18:39 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung nicht möglich on Fri, 11 May 2012 10:31:17 GMT]]></title><description><![CDATA[<p>Kompiliert bei mir mit gcc 4.7.0. Gib mal nen kompletten Testcase her, der das Problem erzeugt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210488</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Fri, 11 May 2012 10:31:17 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung nicht möglich on Fri, 11 May 2012 10:56:20 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Kompiliert bei mir mit gcc 4.7.0. Gib mal nen kompletten Testcase her, der das Problem erzeugt.</p>
</blockquote>
<p>Sogar 4.4 schluckt das.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210497</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 11 May 2012 10:56:20 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung nicht möglich on Fri, 11 May 2012 11:11:25 GMT]]></title><description><![CDATA[<p>Naja, ohne benutzenden Code schluckt der bei Templates im Zweifel einiges. Mit dem, was bisher vorliegt, ist die Frage stumpf nicht zu beantworten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210500</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Fri, 11 May 2012 11:11:25 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung nicht möglich on Fri, 11 May 2012 11:21:24 GMT]]></title><description><![CDATA[<p>Bestimmt verwendet pi insgeheim doch msvc++ <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>EDIT um noch was produktives beizusteuern:</p>
<p>Ich vermute, dein Problem ist das hier:</p>
<pre><code class="language-cpp">typedef unsigned char digit;

    template&lt; digit... &gt;
    class bigint;

    template &lt;typename T&gt;
    struct valdef
    {
        typedef T value;
    };

    template &lt;typename&gt;
    struct pop_back;

    template&lt;&gt;
    struct pop_back&lt; bigint&lt;&gt; &gt;
    {
    };

    template &lt;digit... Head, digit Tail&gt;
    struct pop_back&lt;bigint&lt;Head..., Tail&gt;&gt;
        : valdef&lt;bigint&lt;Head...&gt;&gt;
    {};

    int main()
    {
        pop_back&lt; bigint&lt; 1 &gt; &gt; f;
    }
</code></pre>
<pre><code>aggregate 'pop_back&lt;bigint&lt;1u&gt; &gt; f' has incomplete type and cannot be defined
</code></pre>
<p>Ich glaube das liegt daran, dass die Argumente von bigint so weit wie möglich in den Parameterpack Head... kommen, d.h. danach ist kein template parameter mehr für den Tail übrig, also ist die partielle Spezialisierung von pop_back nicht gültig für diese template - Instanzierung. (k.A. ob das so im Standard steht und wo)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210501</guid><dc:creator><![CDATA[GorbGorb]]></dc:creator><pubDate>Fri, 11 May 2012 11:21:24 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung nicht möglich on Fri, 11 May 2012 12:00:44 GMT]]></title><description><![CDATA[<p>Wird wohl daran liegen, was GorbGorb gesagt hat. Ich hab pop_back jetzt einfach umgeschrieben.</p>
<pre><code class="language-cpp">template &lt;typename&gt;
	struct pop_back;

	template &lt;digit D&gt;
	struct pop_back&lt;bigint&lt;D&gt;&gt;
		: valdef&lt;bigint&lt;&gt;&gt;
	{};

	template &lt;digit Head1, digit Head2, digit... Tail&gt;
	struct pop_back&lt;bigint&lt;Head1, Head2, Tail...&gt;&gt;
		: valdef
		&lt;
			typename push_front
			&lt;
				Head1,
				typename pop_back&lt;bigint&lt;Head2, Tail...&gt;&gt;::value
			&gt;::value
		&gt;
	{};
</code></pre>
<p>Ist zwar komplizierter, aber funktioniert. Und nein, ich verwende nicht MSVC.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210516</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 11 May 2012 12:00:44 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung nicht möglich on Fri, 11 May 2012 11:58:52 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/22268">@PI</a>: Hast du vielleicht ein typename vergessen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210517</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210517</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Fri, 11 May 2012 11:58:52 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung nicht möglich on Fri, 11 May 2012 12:01:19 GMT]]></title><description><![CDATA[<p>Ich vergesse keine typenames. Ich habe noch nie eines vergessen. Noch. Nie. Niemals.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210518</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 11 May 2012 12:01:19 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung nicht möglich on Fri, 11 May 2012 12:14:22 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Ich vergesse keine typenames. Ich habe noch nie eines vergessen. Noch. Nie. Niemals.</p>
</blockquote>
<p>Da greift jetzt so etwas ähnliches wie Poes Gesetz, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210521</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Fri, 11 May 2012 12:14:22 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung nicht möglich on Fri, 11 May 2012 12:25:10 GMT]]></title><description><![CDATA[<p>Hihi. Musste das eben nachschlagen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /><br />
Ja, ich meine das ernst. Schick mir 10.000 LOC Heavy-Template-Shit in dem typenames fehlen und ich finde alle Stellen, ohne Zuhilfenahme eines Tools.<br />
Ich bin da besser als somancher *hust MSVC hust* Compiler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210523</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 11 May 2012 12:25:10 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Spezialisierung nicht möglich on Fri, 11 May 2012 13:46:30 GMT]]></title><description><![CDATA[<p>GorbGorb schrieb:</p>
<blockquote>
<p>Ich glaube das liegt daran, dass die Argumente von bigint so weit wie möglich in den Parameterpack Head... kommen, d.h. danach ist kein template parameter mehr für den Tail übrig, also ist die partielle Spezialisierung von pop_back nicht gültig für diese template - Instanzierung. (k.A. ob das so im Standard steht und wo)</p>
</blockquote>
<p>Sehr gut.<br />
Mit ein bisschen Überlegung erkennt man, dass das Problem bie Klassentemplates nur bei partieller Spezialisierung auftritt. Bei expliziter Spezialisierung sind sowieso keine Parameter zu deduzieren, und bei Primärtemplates steht ein eventuell vorhandenes Parameterpack immer am Ende.</p>
<p>Fange mit der Suche also in 14.5.5.1 [temp.class.spec.match] an</p>
<blockquote>
<p>...<br />
2 A partial specialization matches a given actual template argument list if the template arguments of the<br />
partial specialization can be deduced from the actual template argument list (14.8.2).<br />
...</p>
</blockquote>
<p>Weiter nach 14.8.2.5 [temp.deduct.type] (hier geht es um die Deduktion eines Typen, nämlich bigint &lt;...&gt;)</p>
<blockquote>
<p>...<br />
9 If P has a form that contains &lt;T&gt; or &lt;i&gt;, then each argument Pi of the respective template argument list<br />
P is compared with the corresponding argument Ai of the corresponding template argument list of A. <strong>If<br />
the template argument list of P contains a pack expansion that is not the last template argument, the<br />
entire template argument list is a non-deduced context.</strong> If Pi is a pack expansion, then the pattern of Pi<br />
is compared with each remaining argument in the template argument list of A. Each comparison deduces<br />
template arguments for subsequent positions in the template parameter packs expanded by Pi. During<br />
partial ordering (14.8.2.4), if Ai was originally a pack expansion:<br />
— if P does not contain a template argument corresponding to Ai then Ai is ignored;<br />
— otherwise, if Pi is not a pack expansion, template argument deduction fails.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2210564</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210564</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 11 May 2012 13:46:30 GMT</pubDate></item></channel></rss>