<?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[typedef Class&amp;lt;int, typename&amp;gt; t_Class]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Ich war ursprünglich auf der Suche nach sowas:</p>
<pre><code class="language-cpp">template&lt;typename T, typename A&gt;
class CTemplate
{ };

template&lt;typename T&gt;
typedef CTemplate&lt;int, T&gt; t_Template;
</code></pre>
<p>Musste aber feststellen, dass es dies anscheinend nicht gibt. Nach weiterem rumprobieren, hat plötzlich etwas funktioniert, wo ich allerdings Mühe habe zu verstehen, was das soll.</p>
<pre><code class="language-cpp">template&lt;typename T, typename A&gt;
class CTemplate
{
public:
    A m_A;
};

typedef CTemplate&lt;int, typename&gt; t_Template;

int main()
{
    t_Template Template;

    /* (1)
    std::cout &lt;&lt; Template.m_A &lt;&lt; std::endl;
    */

    return 0;
}
</code></pre>
<p>Das kompiliert einwandfrei, sogar wenn ich <code>(1)</code> unkommentiere. Wenn es kommentiert ist, läuft es sogar ohne Absturz durch. Wenn ich es unkommentiere, dann kommt ein Laufzeitfehler, welcher mir meldet, dass die Variable <code>Template</code> uninitialisiert ist.</p>
<p>Kann mir einer sagen, was das sein soll?</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/216151/typedef-class-lt-int-typename-gt-t_class</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 18:30:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/216151.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 19 Jun 2008 17:05:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to typedef Class&amp;lt;int, typename&amp;gt; t_Class on Thu, 19 Jun 2008 17:05:18 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Ich war ursprünglich auf der Suche nach sowas:</p>
<pre><code class="language-cpp">template&lt;typename T, typename A&gt;
class CTemplate
{ };

template&lt;typename T&gt;
typedef CTemplate&lt;int, T&gt; t_Template;
</code></pre>
<p>Musste aber feststellen, dass es dies anscheinend nicht gibt. Nach weiterem rumprobieren, hat plötzlich etwas funktioniert, wo ich allerdings Mühe habe zu verstehen, was das soll.</p>
<pre><code class="language-cpp">template&lt;typename T, typename A&gt;
class CTemplate
{
public:
    A m_A;
};

typedef CTemplate&lt;int, typename&gt; t_Template;

int main()
{
    t_Template Template;

    /* (1)
    std::cout &lt;&lt; Template.m_A &lt;&lt; std::endl;
    */

    return 0;
}
</code></pre>
<p>Das kompiliert einwandfrei, sogar wenn ich <code>(1)</code> unkommentiere. Wenn es kommentiert ist, läuft es sogar ohne Absturz durch. Wenn ich es unkommentiere, dann kommt ein Laufzeitfehler, welcher mir meldet, dass die Variable <code>Template</code> uninitialisiert ist.</p>
<p>Kann mir einer sagen, was das sein soll?</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1532455</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1532455</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 19 Jun 2008 17:05:18 GMT</pubDate></item><item><title><![CDATA[Reply to typedef Class&amp;lt;int, typename&amp;gt; t_Class on Thu, 19 Jun 2008 17:25:05 GMT]]></title><description><![CDATA[<p>Das ist kein Standard-C++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1532461</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1532461</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 19 Jun 2008 17:25:05 GMT</pubDate></item><item><title><![CDATA[Reply to typedef Class&amp;lt;int, typename&amp;gt; t_Class on Thu, 19 Jun 2008 17:30:09 GMT]]></title><description><![CDATA[<pre><code>8: error: using 'typename' outside of template
8: error: template argument 2 is invalid
8: error: invalid type in declaration before ';' token
</code></pre>
<p>Welcher Compiler lässt dir das durch?</p>
<p>P.S.: Bis der neue Standard kommt musst du dir wohl oder übel mit sowas behelfen:</p>
<pre><code class="language-cpp">template &lt;typename A, typename B&gt;
class Template
{
// ...
};

template &lt;typename T&gt;
class IntTemplate : public Template&lt;int, T&gt;
{
// Alle Konstruktoren von Template zum durchreichen nachbauen und hoffen, dass
// niemand die für bestimmte B verändert hat
};

// oder
template &lt;typename T&gt;
struct IntTemplate
{
    typedef Template&lt;int, T&gt; type;
};
// Zugriff mit typename IntTemplate&lt;bla&gt;::type
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1532463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1532463</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Thu, 19 Jun 2008 17:30:09 GMT</pubDate></item><item><title><![CDATA[Reply to typedef Class&amp;lt;int, typename&amp;gt; t_Class on Thu, 19 Jun 2008 18:18:28 GMT]]></title><description><![CDATA[<p>Dachte ich mir doch, dass dies kein Standard C++ sein kann.</p>
<p>Durchlassen tut mir das der MS Visual Studio 2005 Compiler.</p>
<p>Edit:<br />
Bezüglich des Edits von filmor,<br />
Daran hatte ich auch schon gedacht, bzw. vor allem an die zweite Möglichkeit. Aber das würde die Situation nicht vereinfachen, welche ich versuche zu vereinfachen:</p>
<pre><code class="language-cpp">template&lt;typename TNode&gt;
CNodeIterator&lt;t_NodeList::const_reverse_iterator, TNode&gt; rbegin(t_NodeList const&amp; rNodeList)
{ return CNodeIterator&lt;t_NodeList::const_reverse_iterator, TNode&gt;(rNodeList.rbegin(), rNodeList.rend()); }
</code></pre>
<p>Das ist das extremste. Wäre halt praktischer, wenn man den Rückgabetyp kürzer schreiben könnte <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>Muss es halt der Anwender der Funktion machen und zwar ca. so:</p>
<pre><code class="language-cpp">// Irgendwo in einer Funktion
typedef CNodeIterator&lt;t_NodeList::const_reverse_iterator, CElement&gt; t_ElemIter;

t_ElemIter ElemIter = rbegin&lt;CElement&gt;(NodeList);
</code></pre>
<p>Daher, nicht weiter schlimm <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1532464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1532464</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 19 Jun 2008 18:18:28 GMT</pubDate></item><item><title><![CDATA[Reply to typedef Class&amp;lt;int, typename&amp;gt; t_Class on Thu, 19 Jun 2008 19:19:42 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Edit:<br />
Bezüglich des Edits von filmor,<br />
Daran hatte ich auch schon gedacht, bzw. vor allem an die zweite Möglichkeit. Aber das würde die Situation nicht vereinfachen, welche ich versuche zu vereinfachen:</p>
<pre><code class="language-cpp">template&lt;typename TNode&gt;
CNodeIterator&lt;t_NodeList::const_reverse_iterator, TNode&gt;
rbegin(t_NodeList const&amp; rNodeList)
{ return CNodeIterator&lt;t_NodeList::const_reverse_iterator, TNode&gt;(rNodeList.rbegin(), rNodeList.rend()); }
</code></pre>
<p>Das ist das extremste. Wäre halt praktischer, wenn man den Rückgabetyp kürzer schreiben könnte <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>Ich arbeite gerade an einer Bibliothek mit, wo wir dieses Problem dauernd und in noch schlimmerer Form haben.</p>
<p>Ein übliches Idiom ist bei uns sowas hier:</p>
<pre><code class="language-cpp">template &lt;typename TIter, typename TNode&gt;
struct NodeIter {
    typedef CNodeIterator&lt;TIter, TNode&gt; Type;
};

template&lt;typename TNode&gt;
CNodeIterator&lt;t_NodeList::const_reverse_iterator, TNode&gt; rbegin(t_NodeList const&amp; rNodeList)
{
    typedef typename NodeIter&lt;t_NodeList::const_reverse_iterator, TNode&gt; TRet;
    return TRet(rNodeList.rbegin(), rNodeList.rend());
}
</code></pre>
<p>Structs dieser Art nennt man „Metafunktionen“, da sie analog zu Funktionen Eingabe- und einen Rückgabewert haben, nur eben auf Typenebene (daher „meta-“), also statt Werteparametern Typenparameter und einen Typ als Rückgabewert. Analog zu 'return' schreibt man 'typedef … Type;'. Der „Aufruf“ einer Metafunktion läuft eben über den Zugriff auf diesen typedef ab.</p>
<p>Wobei man diese Metafunktionen sogar durch (partielle) Spezialisierung „überladen“ kann. Sie machen Den Code also gar nicht unbedingt kürzer, heben aber eine Kopplung an konkrete Typen auf.</p>
<p>(Falls jemand neugierig ist: <a href="http://www.seqan.de/" rel="nofollow">http://www.seqan.de/</a>)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1532539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1532539</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Thu, 19 Jun 2008 19:19:42 GMT</pubDate></item></channel></rss>