<?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[Frage zu template instantiations]]></title><description><![CDATA[<p>Hallo Community,</p>
<p>Ich würde gerne wissen, was derartige preceeding vor einer Klassendefinition genau bedeuten</p>
<pre><code>template &lt;
        typename kern_type 
        &gt;
    class rvm_trainer 
    {

    public:
        typedef kern_type kernel_type;
        typedef typename kernel_type::scalar_type scalar_type;
        typedef typename kernel_type::sample_type sample_type;
        typedef typename kernel_type::mem_manager_type mem_manager_type;
        typedef decision_function&lt;kernel_type&gt; trained_function_type;
</code></pre>
<p>Wie ich das gelernt habe:</p>
<p><strong>rvm_trainer</strong> ist eine template class, die bei Deklarierung einer Variablen vom Typ <strong>rvm_trainer</strong> spezialisiert wird, zB. durch</p>
<pre><code>rvm_trainer&lt;kernel_type&gt; trainer{};
</code></pre>
<p>Also gilt von jetzt an sozusagen kernel_type = kernel_type. Im public Bereich wird das dann auch direkt typedefed. Nebenfrage: Ginge hier auch die using direktive?</p>
<pre><code>typedef kern_type kernel_type;
</code></pre>
<p>Womit ich jetzt aber Verständnisprobleme habe, ist der folgende Codeblock</p>
<pre><code>typedef typename kernel_type::scalar_type scalar_type;
        typedef typename kernel_type::sample_type sample_type;
        typedef typename kernel_type::mem_manager_type mem_manager_type;
        typedef decision_function&lt;kernel_type&gt; trained_function_type;
</code></pre>
<p>was vor allem an den typedefs in Verbindung mit den typenames liegt. Und was genau macht hier der Scope resolution operator?</p>
<p>Ich bin verwirrt <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="=/"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/338833/frage-zu-template-instantiations</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Apr 2026 02:52:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/338833.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 13 Jul 2016 19:31:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu template instantiations on Wed, 13 Jul 2016 19:31:38 GMT]]></title><description><![CDATA[<p>Hallo Community,</p>
<p>Ich würde gerne wissen, was derartige preceeding vor einer Klassendefinition genau bedeuten</p>
<pre><code>template &lt;
        typename kern_type 
        &gt;
    class rvm_trainer 
    {

    public:
        typedef kern_type kernel_type;
        typedef typename kernel_type::scalar_type scalar_type;
        typedef typename kernel_type::sample_type sample_type;
        typedef typename kernel_type::mem_manager_type mem_manager_type;
        typedef decision_function&lt;kernel_type&gt; trained_function_type;
</code></pre>
<p>Wie ich das gelernt habe:</p>
<p><strong>rvm_trainer</strong> ist eine template class, die bei Deklarierung einer Variablen vom Typ <strong>rvm_trainer</strong> spezialisiert wird, zB. durch</p>
<pre><code>rvm_trainer&lt;kernel_type&gt; trainer{};
</code></pre>
<p>Also gilt von jetzt an sozusagen kernel_type = kernel_type. Im public Bereich wird das dann auch direkt typedefed. Nebenfrage: Ginge hier auch die using direktive?</p>
<pre><code>typedef kern_type kernel_type;
</code></pre>
<p>Womit ich jetzt aber Verständnisprobleme habe, ist der folgende Codeblock</p>
<pre><code>typedef typename kernel_type::scalar_type scalar_type;
        typedef typename kernel_type::sample_type sample_type;
        typedef typename kernel_type::mem_manager_type mem_manager_type;
        typedef decision_function&lt;kernel_type&gt; trained_function_type;
</code></pre>
<p>was vor allem an den typedefs in Verbindung mit den typenames liegt. Und was genau macht hier der Scope resolution operator?</p>
<p>Ich bin verwirrt <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="=/"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502234</guid><dc:creator><![CDATA[Sewing]]></dc:creator><pubDate>Wed, 13 Jul 2016 19:31:38 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu template instantiations on Wed, 13 Jul 2016 19:48:49 GMT]]></title><description><![CDATA[<p>Sewing schrieb:</p>
<blockquote>
<p>Nebenfrage: Ginge hier auch die using direktive?</p>
</blockquote>
<p>Ja.</p>
<blockquote>
<p>was vor allem an den typedefs in Verbindung mit den typenames liegt.</p>
</blockquote>
<p><a href="http://pages.cs.wisc.edu/~driscoll/typename.html" rel="nofollow">Der wahre Nutzen von typename</a>.</p>
<blockquote>
<p>Und was genau macht hier der Scope resolution operator?</p>
</blockquote>
<p>Er löst den Scope auf <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2502238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502238</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 13 Jul 2016 19:48:49 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu template instantiations on Wed, 13 Jul 2016 20:01:08 GMT]]></title><description><![CDATA[<p>Danke, das lese ich mir mal durch. Hoffe das beantwortet meine Fragen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502240</guid><dc:creator><![CDATA[Sewing]]></dc:creator><pubDate>Wed, 13 Jul 2016 20:01:08 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu template instantiations on Wed, 13 Jul 2016 21:05:43 GMT]]></title><description><![CDATA[<p>Und warum wird hier nicht direkt statt</p>
<pre><code>typedef kern_type kernel_type;
</code></pre>
<p>der template parameter <strong>kernel_type</strong> statt <strong>kern_type</strong> genannt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502249</guid><dc:creator><![CDATA[Sewing]]></dc:creator><pubDate>Wed, 13 Jul 2016 21:05:43 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu template instantiations on Wed, 13 Jul 2016 21:11:59 GMT]]></title><description><![CDATA[<p>Namen von Templateparametern sind nach außen nicht sichtbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502250</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502250</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 13 Jul 2016 21:11:59 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu template instantiations on Wed, 13 Jul 2016 21:15:19 GMT]]></title><description><![CDATA[<p>was ist hier <strong>außen</strong>? Außerhalb des Class scopes?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502252</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502252</guid><dc:creator><![CDATA[Sewing]]></dc:creator><pubDate>Wed, 13 Jul 2016 21:15:19 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu template instantiations on Wed, 13 Jul 2016 21:49:13 GMT]]></title><description><![CDATA[<p>Ja. Alles was nicht die <s>Instanzierung</s> Definition von <code>rvm_trainer</code> ist. Aussen halt <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="🤡"
    /></p>
<p>EDIT: Unfug korrigiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502255</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 13 Jul 2016 21:49:13 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu template instantiations on Wed, 13 Jul 2016 21:32:43 GMT]]></title><description><![CDATA[<p>Um mal konkret zu werden, da dir anscheinend nicht klar ist, was hier erreicht werden soll:<br />
Später soll es möglich sein, dass der Benutzer der fertigen Klasse die ganzen Typdefinitionen benutzen kann. Denk an std::vector als ein typisches Beispiel, wo es so etwas gibt. Siehe <a href="http://en.cppreference.com/w/cpp/container/vector" rel="nofollow">hier unter Member tpyes</a>. Das wird beim vector ziemlich ähnlich programmiert sein wie bei deiner Klasse hier. Und nützlich ist das, wenn man dann später so etwas wie</p>
<pre><code>typedef vector&lt;int&gt; container_typ;
</code></pre>
<p>macht und dann den Typ braucht, der überhaupt in dem Container gespeichert ist. Und in anderen Fällen, wie dem Iteratortyp, braucht man solche Definitionen auch ohne typedef.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502260</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 13 Jul 2016 21:32:43 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu template instantiations on Wed, 13 Jul 2016 21:58:15 GMT]]></title><description><![CDATA[<p>OK danke Euch!</p>
<p>Also ist diese Notation nötig, wenn ich später mit einem Objekt der Klasse Attribute/Methoden der Klasse zugreifen möchte, mit der die template Klasse instantiiert wurde. Dazu der Scope resolution operator, auf den der Bezeichner folgen muss,</p>
<pre><code>typedef kern_type kernel_type; 
        typedef typename kernel_type::scalar_type scalar_type; 
        typedef typename kernel_type::sample_type sample_type; 
        typedef typename kernel_type::mem_manager_type mem_manager_type; 
        typedef decision_function&lt;kernel_type&gt; trained_function_type;
</code></pre>
<p>der in der Klasse existiert (vielleicht ebenfalls als typedef), mit der instantiiert wird. typename muss davor, um Doppeldeutigkeiten zu vermeiden und typedefs optional davor. Ich könnte doch auch weiterhin <strong>kernel_type::scalar_type</strong> verwenden nicht?</p>
<p>Und ob ich dann <strong>kernel_type</strong> oder <strong>kern_type</strong> für die restlichen Deklarationen oben verwende, ist egal?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502264</guid><dc:creator><![CDATA[Sewing]]></dc:creator><pubDate>Wed, 13 Jul 2016 21:58:15 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu template instantiations on Thu, 14 Jul 2016 06:29:28 GMT]]></title><description><![CDATA[<p>Sewing schrieb:</p>
<blockquote>
<p>Also ist diese Notation nötig, wenn ich später mit einem Objekt der Klasse Attribute/Methoden der Klasse zugreifen möchte, mit der die template Klasse instantiiert wurde. Dazu der Scope resolution operator, auf den der Bezeichner folgen muss,</p>
</blockquote>
<p>Ich weiß nicht, was du meinst. Klingt wirr.</p>
<blockquote>
<p>typedefs optional davor.</p>
</blockquote>
<p>Nein, die sind nicht optional, du möchtest schließlich einen typedef machen. Du könntest alternativ using in seiner neuen typedef-artigen Bedeutung benutzen, aber dann wäre die Syntax</p>
<pre><code>using scalar_type = typename ernel_type::scalar_type;
</code></pre>
<blockquote>
<p>Ich könnte doch auch weiterhin <strong>kernel_type::scalar_type</strong> verwenden nicht?</p>
</blockquote>
<p>Wie, was, wo? Wovon redest du?</p>
<blockquote>
<p>Und ob ich dann <strong>kernel_type</strong> oder <strong>kern_type</strong> für die restlichen Deklarationen oben verwende, ist egal?</p>
</blockquote>
<p>Da die beiden hier gleich sind, macht es keinen Unterschied. Der Unterschied ist philosophischer Natur, da sich die Definition kernel_type = kern_type ja auch irgendwann einmal ändern könnte (Wobei das in diesem Beispiel eher unwahrscheinlich klingt). Dann ist nämlich die Frage, ob dann die Folgetypedefs sich auf kernel_type oder direkt auf den Templateparameter kern_type beziehen. Vom Namen der typedefs her, hier wohl eher Ersteres.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502294</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502294</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 14 Jul 2016 06:29:28 GMT</pubDate></item></channel></rss>