<?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[Verschachtelte templates...]]></title><description><![CDATA[<p>Hallo</p>
<p>folgender Code:</p>
<pre><code class="language-cpp">template&lt;template&lt;class&gt;class&gt;class foo
{
public:
	void blub()
	{
	}
	template&lt;template&lt;class&gt;class&gt;void blub()
	{
	}
};

template&lt;class dub&gt; class bar
{
public:
	void blub()
	{
		dub d;
		d.blub(); //OK
		d.blub&lt;bar&gt;(); //WTF
	}
};

int main()
{
	bar&lt; foo&lt;bar&gt; &gt; c;
	c.blub();

	return 0;
}
</code></pre>
<p>Sieht natürlich auf den ersten Blick etwas kryptisch aus, aber in meinem Zusammenhang macht er durchaus sinn.</p>
<p>Bei der Zeile, die ich mit WTF makiert habe, sagt mir VC2008 (gcc kann man outputmäßig hier vergessen!):</p>
<pre><code>1&gt;.\main.cpp(19) : error C3207: 'foo&lt;&lt;unnamed-symbol&gt;&gt;::blub' : invalid template argument for '&lt;unnamed-symbol&gt;', class template expected
1&gt;        with
1&gt;        [
1&gt;            &lt;unnamed-symbol&gt;=bar
1&gt;        ]
1&gt;        .\main.cpp(7) : see declaration of 'foo&lt;&lt;unnamed-symbol&gt;&gt;::blub'
1&gt;        with
1&gt;        [
1&gt;            &lt;unnamed-symbol&gt;=bar
1&gt;        ]
1&gt;        .\main.cpp(16) : while compiling class template member function 'void bar&lt;dub&gt;::blub(void)'
1&gt;        with
1&gt;        [
1&gt;            dub=foo&lt;bar&gt;
1&gt;        ]
1&gt;        .\main.cpp(25) : see reference to class template instantiation 'bar&lt;dub&gt;' being compiled
1&gt;        with
1&gt;        [
1&gt;            dub=foo&lt;bar&gt;
</code></pre>
<p>Was ist falsch bzw. wie könnte ich das Problem lösen?</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/230634/verschachtelte-templates</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 04:08:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/230634.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 30 Dec 2008 03:32:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verschachtelte templates... on Tue, 30 Dec 2008 03:32:23 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>folgender Code:</p>
<pre><code class="language-cpp">template&lt;template&lt;class&gt;class&gt;class foo
{
public:
	void blub()
	{
	}
	template&lt;template&lt;class&gt;class&gt;void blub()
	{
	}
};

template&lt;class dub&gt; class bar
{
public:
	void blub()
	{
		dub d;
		d.blub(); //OK
		d.blub&lt;bar&gt;(); //WTF
	}
};

int main()
{
	bar&lt; foo&lt;bar&gt; &gt; c;
	c.blub();

	return 0;
}
</code></pre>
<p>Sieht natürlich auf den ersten Blick etwas kryptisch aus, aber in meinem Zusammenhang macht er durchaus sinn.</p>
<p>Bei der Zeile, die ich mit WTF makiert habe, sagt mir VC2008 (gcc kann man outputmäßig hier vergessen!):</p>
<pre><code>1&gt;.\main.cpp(19) : error C3207: 'foo&lt;&lt;unnamed-symbol&gt;&gt;::blub' : invalid template argument for '&lt;unnamed-symbol&gt;', class template expected
1&gt;        with
1&gt;        [
1&gt;            &lt;unnamed-symbol&gt;=bar
1&gt;        ]
1&gt;        .\main.cpp(7) : see declaration of 'foo&lt;&lt;unnamed-symbol&gt;&gt;::blub'
1&gt;        with
1&gt;        [
1&gt;            &lt;unnamed-symbol&gt;=bar
1&gt;        ]
1&gt;        .\main.cpp(16) : while compiling class template member function 'void bar&lt;dub&gt;::blub(void)'
1&gt;        with
1&gt;        [
1&gt;            dub=foo&lt;bar&gt;
1&gt;        ]
1&gt;        .\main.cpp(25) : see reference to class template instantiation 'bar&lt;dub&gt;' being compiled
1&gt;        with
1&gt;        [
1&gt;            dub=foo&lt;bar&gt;
</code></pre>
<p>Was ist falsch bzw. wie könnte ich das Problem lösen?</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1637136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1637136</guid><dc:creator><![CDATA[RudolfRenntier]]></dc:creator><pubDate>Tue, 30 Dec 2008 03:32:23 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte templates... on Tue, 30 Dec 2008 13:26:50 GMT]]></title><description><![CDATA[<p>Die Fehlermeldung sagt eigentlich schon alles. Du musst dem bar einen Templateparameter übergeben. Man kann keine Klassentemplates (beachte Unterschied zu Templateklasse) als Templateparameter übergeben.</p>
<pre><code class="language-cpp">template&lt;class dub&gt;
class bar
{
public:
    void blub()
    {
        dub d;
        d.blub(); //OK
        d.blub&lt;bar&lt;dub&gt; &gt;(); // wird funktionieren ;)
    }
};
</code></pre>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1637254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1637254</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 30 Dec 2008 13:26:50 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte templates... on Tue, 30 Dec 2008 14:01:04 GMT]]></title><description><![CDATA[<p>Sicher?</p>
<p>[cpp]template&lt;**template&lt;class&gt;**class&gt;void blub()<br />
{<br />
}[/cpp]</p>
<p>Zumindest sagt mir der Compiler bei deiner Variante (die nicht in meinem Sinne ist, ich will wirklich eine Klassentemplate übergeben!) folgendes:</p>
<pre><code>error C3207: 'foo&lt;&lt;unnamed-symbol&gt;&gt;::blub' : invalid template argument for '&lt;unnamed-symbol&gt;', class template expected
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1637272</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1637272</guid><dc:creator><![CDATA[RudolfRenntier]]></dc:creator><pubDate>Tue, 30 Dec 2008 14:01:04 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte templates... on Tue, 30 Dec 2008 14:21:03 GMT]]></title><description><![CDATA[<p>Ich denke, dass das Problem wo anderst liegt.</p>
<p>bar ist innerhalb von bar kein Klassentemplate, da der Name für die Templateklasse bar&lt;dub&gt; steht.</p>
<p>Also musst du da ein Klassentemplate angeben.:<br />
z.B</p>
<pre><code class="language-cpp">template&lt;class&gt;
class k{};

template&lt;class dub&gt; class bar
{
public:
    void blub()
    {
        dub d;
        d.blub(); //OK
        d.blub&lt; k &gt;(); //WTF
    }
};
</code></pre>
<p>oder das globale template benutzen:</p>
<pre><code class="language-cpp">template&lt;class dub&gt; class bar
{
public:
    void blub()
    {
        dub d;
        d.blub(); //OK
        d.blub&lt; ::bar &gt;(); //WTF
    }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1637278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1637278</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 30 Dec 2008 14:21:03 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte templates... on Tue, 30 Dec 2008 14:22:12 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template&lt;class dub&gt; class bar
{
public:
    void blub()
    {
        dub d;
        d.blub(); //OK
        d.blub&lt; ::bar &gt;(); //WTF
    }
};
</code></pre>
</blockquote>
<p>da fehlt jetzt noch das &quot;template&quot; <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>
<pre><code class="language-cpp">template&lt;class dub&gt; class bar
{
public:
    void blub()
    {
        dub d;
        d.blub(); //OK
        d.template blub&lt; ::bar &gt;(); //WTF
    }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1637279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1637279</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Tue, 30 Dec 2008 14:22:12 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte templates... on Tue, 30 Dec 2008 14:38:33 GMT]]></title><description><![CDATA[<p>*muss seinen Fehler eingestehen*<br />
Aber aktuell habe ich solche Augen -&gt; <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Irgendwie habe ich das bisher falsch verstanden mit den Template Template Parameter.<br />
Tjo, man lernt nie aus <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="🙂"
    /><br />
*wird nochmals das Kapitel dazu durchlesen müssen*</p>
<p>Sorry für die Falschinformation.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1637288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1637288</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 30 Dec 2008 14:38:33 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte templates... on Tue, 30 Dec 2008 15:42:02 GMT]]></title><description><![CDATA[<p>Vielen lieben Dank für eure Antworten. Auf VS2008 läuft der Spaß nun einwandfrei! Mit gcc auch, solange man zwischen &lt; und :: Whitespaces einfügt (&quot;'&lt;:' is an alternate spelling for '</p>
<p>evilissimo schrieb:</p>
<blockquote>
<p>between '&lt;' and '::'&quot;).</p>
<p>[quote=&quot;evilissimo&quot;]da fehlt jetzt noch das &quot;template&quot; <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>Das ist interessant. Dieses Konstrukt habe ich zwar schon einige Male gesehen, aber nie wirklich verstanden, wozu es gut ist (explizite Instatiierung - wozu?!). Kannst du mit zu dem entsprechenden Paragraphen im Standart weiterleiten? Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1637340</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1637340</guid><dc:creator><![CDATA[RudolfRenntier]]></dc:creator><pubDate>Tue, 30 Dec 2008 15:42:02 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte templates... on Tue, 30 Dec 2008 16:12:12 GMT]]></title><description><![CDATA[<p>RudolfRenntier schrieb:</p>
<blockquote>
<p>Das ist interessant. Dieses Konstrukt habe ich zwar schon einige Male gesehen, aber nie wirklich verstanden, wozu es gut ist (explizite Instatiierung - wozu?!). Kannst du mit zu dem entsprechenden Paragraphen im stan**** weiterleiten? Vielen Dank!</p>
</blockquote>
<p>Jetzt kann ich doch noch helfen, hoffentlich <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="🙂"
    /><br />
Ich kenne zwar den Standar<strong>d</strong> Paragraphen nicht, wo das erklärt wird, da ich den Standard nicht habe, aber die Sache ist recht simpel und geht auf das gleiche zurück, wie das Problem mit <code>typename</code> bei einem Typen, welcher von einem Templateparameter abhängig ist.</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
void foo(std::vector&lt;T&gt;&amp; values)
{
  typename std::vector&lt;T&gt;::iterator iter = values.begin();
  // ...
}
</code></pre>
<p>Dieses Problem sollte bekannt sein. Da der Kompiler die Klasse vector noch nicht vollständig kennt, nimmt der Kompiler per Default an, dass iterator kein Typ, sondern eine statische Variable ist. Deshalb muss man das typename hinschreiben.</p>
<p>Bei einem Funktionsaufruf mit Templateparameter ist das ähnlich.</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
struct Bar
{
  template&lt;typename X&gt;
  void func()
  {
    // ...
  }
};

template&lt;typename T&gt;
void foo(Bar&lt;T&gt;&amp; bar)
{
  bar.template func&lt;int&gt;();
}
</code></pre>
<p>Ohne das <code>template</code> würde der Kompiler denken, dass func eine Membervariable sei und das erste '&lt;' ein &quot;kleiner als&quot; ist. Was folglich zu einem Fehler führt.</p>
<p>Referenz: C++ Templates - The complete guide, 7th Printing April 2006, Seite 44-45</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1637355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1637355</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 30 Dec 2008 16:12:12 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte templates... on Tue, 30 Dec 2008 17:42:19 GMT]]></title><description><![CDATA[<blockquote>
<p>Ohne das template würde der Kompiler denken, dass func eine Membervariable sei und das erste '&lt;' ein &quot;kleiner als&quot; ist. Was folglich zu einem Fehler führt.</p>
</blockquote>
<p>VC++ 08 scheint intelligent genug zu sein, um das richtig zu interpretieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1637395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1637395</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 30 Dec 2008 17:42:19 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte templates... on Tue, 30 Dec 2008 19:36:11 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<blockquote>
<p>Ohne das template würde der Kompiler denken, dass func eine Membervariable sei und das erste '&lt;' ein &quot;kleiner als&quot; ist. Was folglich zu einem Fehler führt.</p>
</blockquote>
<p>VC++ 08 scheint intelligent genug zu sein, um das richtig zu interpretieren.</p>
</blockquote>
<p>Sogar bereits der VC++ 03 und 05. Aber das hat nichts mit Intelligenz zu tun, sondern ist schlicht nicht standardkonform <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="😉"
    /><br />
Ähnliches gilt auch für <code>typename</code> :</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;iostream&gt;

template&lt;typename T&gt;
typename std::vector&lt;T&gt;::iterator					// Hier braucht er es.
foo(std::vector&lt;T&gt;&amp; vec)
{
	std::vector&lt;T&gt;::iterator iter = vec.begin();	// Hier nicht, obwohl es nötig wäre.

	std::cout &lt;&lt; *iter &lt;&lt; std::endl;

	return iter;
}

int main() 
{
	std::vector&lt;int&gt; vec;
	vec.push_back(0);

	std::cout &lt;&lt; *foo(vec) &lt;&lt; std::endl;

	test::wait(&quot;...&quot;);

	return 0; 
}
</code></pre>
<p>(mit VC++ 05 getestet)</p>
<p>Der VC++ unterstützt ja auch schon seit längerem die doppelten schliessenden Templateklammern: '&gt;&gt;'.<br />
Usw.<br />
Ist vielleicht praktisch, aber, soweit ich weiss, nicht standardkonform <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>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1637459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1637459</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 30 Dec 2008 19:36:11 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte templates... on Tue, 30 Dec 2008 23:09:19 GMT]]></title><description><![CDATA[<p>Servus,</p>
<p>ich habe mir nicht den gesamten Beitrag durchgelesen und entschuldige mich hiermit, falls ich daneben liege <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>Suchst du nach ne Möglichkeit verschachtelte Templates zu erstellen? Im allg. sollte man darauf verzichten, da viele es nicht auf den ersten Blick entschlüsseln können.</p>
<pre><code class="language-cpp">template &lt; template &lt; typename, typename &gt; class Container, typename Type &gt;
class MeineKlasse
{
  Container&lt; Type, std::allocator &lt; Type &gt; &gt; baz;
};
</code></pre>
<p>und</p>
<pre><code class="language-cpp">MeineKlasse&lt; std::deque, int &gt; ex;
</code></pre>
<p>Achja, diese Templateform unterstützen nicht alle Compiler. Der GCC kann's jedenfalls, aber ob es der hoch intelligente VC es frisst <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="😕"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Gruß,<br />
Thomas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1637537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1637537</guid><dc:creator><![CDATA[Siassei]]></dc:creator><pubDate>Tue, 30 Dec 2008 23:09:19 GMT</pubDate></item><item><title><![CDATA[Reply to Verschachtelte templates... on Tue, 30 Dec 2008 23:28:40 GMT]]></title><description><![CDATA[<p>Siassei schrieb:</p>
<blockquote>
<p>Servus,<br />
ich habe mir nicht den gesamten Beitrag durchgelesen und entschuldige mich hiermit, falls ich daneben liege <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>Warum tust du es dann?<br />
Und schreibst etwas, was gar nichts mit dem Thema zu tun hat und von der Flameware mal abgesehen. <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/1637546</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1637546</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 30 Dec 2008 23:28:40 GMT</pubDate></item></channel></rss>