<?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[Variadic Templates: Fehler, Mehrdeutiger Aufruf &amp;quot;foo&amp;lt;1&amp;gt; oder foo&amp;lt;1,&amp;gt;&amp;quot;]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich wollte mich langsam an die Variadic Temples rantasten und spiele etwas damit herum. Allerdings scheitere ich schon bei meinem ersten Versuch.</p>
<pre><code>template&lt;int FIRST=0&gt;
void foo(void) {
  std::cout &lt;&lt; FIRST &lt;&lt; std::endl;
}

template&lt;int FIRST, int... REST&gt;
void foo() {
  foo&lt;FIRST&gt;();

  foo&lt;REST...&gt;();
}

int main() {
  foo&lt;1,2,3,4&gt;();
  return 0;
}
</code></pre>
<p>Die Idee ist, dass die Zahlen aus der Template-Parameterliste einfach auf die Konsole geschrieben wird - ohne die Verwendung von Funktions-Parametern.</p>
<p>Fehlermeldungen die ich aus Visual Studio 2015 erhalte sind:</p>
<pre><code>1&gt;test.cpp(16): error C2668: &quot;foo&quot;: Mehrdeutiger Aufruf einer überladenen Funktion
1&gt;  test.cpp(15): note: kann &quot;void foo&lt;1,&gt;(void)&quot; sein
1&gt;  test.cpp(10): note: oder &quot;void foo&lt;1&gt;(void)&quot;
1&gt;  test.cpp(16): note: bei Anpassung der Argumentliste &quot;()&quot;
1&gt;  test.cpp(23): note: Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template &quot;void foo&lt;1,2,3,4&gt;(void)&quot;.
</code></pre>
<p>Ich habe denke ich noch zusätzlich das Verständnisproblem mit foo&lt;1,&gt; und foo&lt;1&gt;. Ich kann schließlich kein Code fehlerfrei kompilieren, der so aussieht:</p>
<pre><code>template&lt;int NUM,&gt;
void foo() {}
</code></pre>
<p>Ich nehme mal an, dass der Compiler richtig arbeitet. Wo liegt bzw. liegen dann meine Fehler?</p>
<p>Vielen Dank für Eure Hilfe.</p>
<p>Viele Grüße,</p>
<p>jb</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/338992/variadic-templates-fehler-mehrdeutiger-aufruf-quot-foo-lt-1-gt-oder-foo-lt-1-gt-quot</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Apr 2026 13:09:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/338992.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 26 Jul 2016 16:09:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Variadic Templates: Fehler, Mehrdeutiger Aufruf &amp;quot;foo&amp;lt;1&amp;gt; oder foo&amp;lt;1,&amp;gt;&amp;quot; on Tue, 26 Jul 2016 16:10:40 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich wollte mich langsam an die Variadic Temples rantasten und spiele etwas damit herum. Allerdings scheitere ich schon bei meinem ersten Versuch.</p>
<pre><code>template&lt;int FIRST=0&gt;
void foo(void) {
  std::cout &lt;&lt; FIRST &lt;&lt; std::endl;
}

template&lt;int FIRST, int... REST&gt;
void foo() {
  foo&lt;FIRST&gt;();

  foo&lt;REST...&gt;();
}

int main() {
  foo&lt;1,2,3,4&gt;();
  return 0;
}
</code></pre>
<p>Die Idee ist, dass die Zahlen aus der Template-Parameterliste einfach auf die Konsole geschrieben wird - ohne die Verwendung von Funktions-Parametern.</p>
<p>Fehlermeldungen die ich aus Visual Studio 2015 erhalte sind:</p>
<pre><code>1&gt;test.cpp(16): error C2668: &quot;foo&quot;: Mehrdeutiger Aufruf einer überladenen Funktion
1&gt;  test.cpp(15): note: kann &quot;void foo&lt;1,&gt;(void)&quot; sein
1&gt;  test.cpp(10): note: oder &quot;void foo&lt;1&gt;(void)&quot;
1&gt;  test.cpp(16): note: bei Anpassung der Argumentliste &quot;()&quot;
1&gt;  test.cpp(23): note: Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template &quot;void foo&lt;1,2,3,4&gt;(void)&quot;.
</code></pre>
<p>Ich habe denke ich noch zusätzlich das Verständnisproblem mit foo&lt;1,&gt; und foo&lt;1&gt;. Ich kann schließlich kein Code fehlerfrei kompilieren, der so aussieht:</p>
<pre><code>template&lt;int NUM,&gt;
void foo() {}
</code></pre>
<p>Ich nehme mal an, dass der Compiler richtig arbeitet. Wo liegt bzw. liegen dann meine Fehler?</p>
<p>Vielen Dank für Eure Hilfe.</p>
<p>Viele Grüße,</p>
<p>jb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2503536</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2503536</guid><dc:creator><![CDATA[__jb__]]></dc:creator><pubDate>Tue, 26 Jul 2016 16:10:40 GMT</pubDate></item><item><title><![CDATA[Reply to Variadic Templates: Fehler, Mehrdeutiger Aufruf &amp;quot;foo&amp;lt;1&amp;gt; oder foo&amp;lt;1,&amp;gt;&amp;quot; on Tue, 26 Jul 2016 16:39:37 GMT]]></title><description><![CDATA[<p><strong>jb</strong> schrieb:</p>
<blockquote>
<p>Hallo zusammen,</p>
<p>ich wollte mich langsam an die Variadic Temples rantasten und spiele etwas damit herum. Allerdings scheitere ich schon bei meinem ersten Versuch.</p>
<pre><code>template&lt;int FIRST=0&gt;
void foo(void) {
  std::cout &lt;&lt; FIRST &lt;&lt; std::endl;
}

template&lt;int FIRST, int... REST&gt;
void foo() {
  foo&lt;FIRST&gt;();

  foo&lt;REST...&gt;();
}

int main() {
  foo&lt;1,2,3,4&gt;();
  return 0;
}
</code></pre>
<p>Die Idee ist, dass die Zahlen aus der Template-Parameterliste einfach auf die Konsole geschrieben wird - ohne die Verwendung von Funktions-Parametern.</p>
</blockquote>
<p>Ich glaube, das wird so nicht funktionieren, weil template partial specialization für Funktionen nicht erlaubt ist. Also mach mal mit Parametern. Allerdings gibt es da trotzdem noch eine Möglichkeit:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;int First = 0, int... Tail&gt;
void f(){
    if(!sizeof...(Tail) &amp;&amp; !First)
        return;

    std::cout &lt;&lt; First;
    f&lt;Tail...&gt;();
}
</code></pre>
<p>Aber das ist nicht so toll, da z.B. f&lt;0&gt;() nichts ausgeben würde.</p>
<blockquote>
<p>Ich habe denke ich noch zusätzlich das Verständnisproblem mit foo&lt;1,&gt; und foo&lt;1&gt;. Ich kann schließlich kein Code fehlerfrei kompilieren, der so aussieht:</p>
<pre><code>template&lt;int NUM,&gt;
void foo() {}
</code></pre>
<p>Ich nehme mal an, dass der Compiler richtig arbeitet. Wo liegt bzw. liegen dann meine Fehler?</p>
<p>Vielen Dank für Eure Hilfe.</p>
<p>Viele Grüße,</p>
<p>jb</p>
</blockquote>
<p>Warum sollte das auch funktionieren. Was willst du damit erreichen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2503540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2503540</guid><dc:creator><![CDATA[654664]]></dc:creator><pubDate>Tue, 26 Jul 2016 16:39:37 GMT</pubDate></item><item><title><![CDATA[Reply to Variadic Templates: Fehler, Mehrdeutiger Aufruf &amp;quot;foo&amp;lt;1&amp;gt; oder foo&amp;lt;1,&amp;gt;&amp;quot; on Tue, 26 Jul 2016 16:46:18 GMT]]></title><description><![CDATA[<p>Ein variables Templateargument kann auch leer sein, also können beide Templates mit nur einem Argument instantiiert werden.<br />
Beide Funktionstemplates haben ausserdem die gleichen Funktionsargumente, daher ist keins der Templates spezieller als das Andere.<br />
Mithin ist foo&lt;x&gt; in jedem beliebigen Kontext mehrdeutig.</p>
<p>Abhilfe am besten dadurch, das die verschiedenen Templates nicht mit der gleichen Anzahl von Templateargumenten umgehen können oder die Typen inkompatibel sind.<br />
z.B.</p>
<pre><code class="language-cpp">template&lt;int FIRST=0&gt;
void foo(void) {
    std::cout &lt;&lt; FIRST &lt;&lt; std::endl;
}

template&lt;int FIRST, int SECOND, int... REST&gt;
void foo() {
  foo&lt;FIRST&gt;();

  foo&lt;SECOND, REST...&gt;();
}
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">template&lt;nullptr_t = nulltptr&gt; // ints können nicht in nullptr_t konvertiert werden...
void foo(void) {
}

template&lt;int FIRST, int... REST&gt;
void foo() {
  std::cout &lt;&lt; FIRST &lt;&lt; std::endl;

  foo&lt;REST...&gt;();
}
</code></pre>
<p>oder... mit C++17</p>
<pre><code class="language-cpp">template&lt;int... bar&gt;
void foo() {
  (  bar &lt;&lt; std::endl &lt;&lt; ... &lt;&lt; std::cout );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2503541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2503541</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 26 Jul 2016 16:46:18 GMT</pubDate></item><item><title><![CDATA[Reply to Variadic Templates: Fehler, Mehrdeutiger Aufruf &amp;quot;foo&amp;lt;1&amp;gt; oder foo&amp;lt;1,&amp;gt;&amp;quot; on Tue, 26 Jul 2016 16:47:24 GMT]]></title><description><![CDATA[<p>654664 schrieb:</p>
<blockquote>
<p><strong>jb</strong> schrieb:</p>
<blockquote>
<p>Ich habe denke ich noch zusätzlich das Verständnisproblem mit foo&lt;1,&gt; und foo&lt;1&gt;. Ich kann schließlich kein Code fehlerfrei kompilieren, der so aussieht:</p>
<pre><code>template&lt;int NUM,&gt;
void foo() {}
</code></pre>
</blockquote>
<p>Warum sollte das auch funktionieren. Was willst du damit erreichen?</p>
</blockquote>
<p>Na ja der Compiler meldet dass er ein Mehrdeutiger Aufruf festgestellt hat.<br />
Es gibt Möglichkeit a: foo&lt;1,&gt;<br />
Und es gibt Möglichkeit b: foo&lt;1&gt;</p>
<p>Mir ist unklar wie er auf foo&lt;1,&gt; kommt, wenn es nicht mal validem Code entspricht. (Hier vermute ich mal ein Denkfehler oder eine falsch Interpretation meiner seits.)</p>
<p>654664 schrieb:</p>
<blockquote>
<p>Ich glaube, das wird so nicht funktionieren, weil template partial specialization für Funktionen nicht erlaubt ist. Also mach mal mit Parametern.</p>
</blockquote>
<p>Ok, wenn das nicht erlaubt ist, dann ist klar warum es nicht geht. Vielen Dank dafür. Kennst Du auch noch den Grund warum es verboten ist?</p>
<p>EDIT:<br />
Hab erst jetzt Deinen, Camper, Beitrag gelesen. Danke dafür.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2503542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2503542</guid><dc:creator><![CDATA[__jb__]]></dc:creator><pubDate>Tue, 26 Jul 2016 16:47:24 GMT</pubDate></item></channel></rss>