<?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[Lokale Klassen und templates: Warum kann man nicht beides haben?]]></title><description><![CDATA[<p>Hallo,</p>
<p>man kann ja in Funktionen lokale Klassen anlegen:</p>
<pre><code class="language-cpp">int main(){
  class foo
    {
    }; 
  foo bar;
}
</code></pre>
<p>Warum darf man lokal keine Klassentemplates verwenden? Folgendes geht nicht:</p>
<pre><code class="language-cpp">int main(){
 template &lt;class T&gt; class foo    // Compilerfehler: Expected primary-expression before 'template'
    {
    }; 
  foo&lt;int&gt; bar;
}
</code></pre>
<p>Dazu 2 Fragen:<br />
Warum geht das nicht? Mir ist der Grund nicht klar, warum der Compiler solch einen Ausdruck nicht übersetzen kann. Schreibe ich die Templatedefinition in den globalen Dateibereich kann es übersetzt werden, warum funktioniert das nicht auch rein lokal wie bei Klassendefinitionen?</p>
<p>Weiß jemand einen Trick, das dennoch hinzubekommen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/239911/lokale-klassen-und-templates-warum-kann-man-nicht-beides-haben</link><generator>RSS for Node</generator><lastBuildDate>Tue, 22 Sep 2026 09:08:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/239911.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 29 Apr 2009 13:09:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Lokale Klassen und templates: Warum kann man nicht beides haben? on Wed, 29 Apr 2009 13:09:05 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>man kann ja in Funktionen lokale Klassen anlegen:</p>
<pre><code class="language-cpp">int main(){
  class foo
    {
    }; 
  foo bar;
}
</code></pre>
<p>Warum darf man lokal keine Klassentemplates verwenden? Folgendes geht nicht:</p>
<pre><code class="language-cpp">int main(){
 template &lt;class T&gt; class foo    // Compilerfehler: Expected primary-expression before 'template'
    {
    }; 
  foo&lt;int&gt; bar;
}
</code></pre>
<p>Dazu 2 Fragen:<br />
Warum geht das nicht? Mir ist der Grund nicht klar, warum der Compiler solch einen Ausdruck nicht übersetzen kann. Schreibe ich die Templatedefinition in den globalen Dateibereich kann es übersetzt werden, warum funktioniert das nicht auch rein lokal wie bei Klassendefinitionen?</p>
<p>Weiß jemand einen Trick, das dennoch hinzubekommen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1703148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1703148</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 29 Apr 2009 13:09:05 GMT</pubDate></item><item><title><![CDATA[Reply to Lokale Klassen und templates: Warum kann man nicht beides haben? on Wed, 29 Apr 2009 14:33:47 GMT]]></title><description><![CDATA[<blockquote>
<p>Warum geht das nicht?</p>
</blockquote>
<p>Ist halt so. Ist laut Standard nicht erlaubt.</p>
<blockquote>
<p>Mir ist der Grund nicht klar, warum der Compiler solch einen Ausdruck nicht übersetzen kann.</p>
</blockquote>
<p>Könnte er, darf er aber nicht.</p>
<blockquote>
<p>Schreibe ich die Templatedefinition in den globalen Dateibereich kann es übersetzt werden, warum funktioniert das nicht auch rein lokal wie bei Klassendefinitionen?</p>
</blockquote>
<p>Du wiederholst dich. Antwort bleibt die selbe: weil der Standard es nicht erlaubt.</p>
<blockquote>
<p>Weiß jemand einen Trick, das dennoch hinzubekommen?</p>
</blockquote>
<p>Verwende einen unnamed namespace.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1703199</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1703199</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 29 Apr 2009 14:33:47 GMT</pubDate></item><item><title><![CDATA[Reply to Lokale Klassen und templates: Warum kann man nicht beides haben? on Thu, 30 Apr 2009 14:08:24 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<blockquote>
<p>Warum geht das nicht?</p>
</blockquote>
<p>Ist halt so. Ist laut Standard nicht erlaubt....</p>
</blockquote>
<p>Trotzdem wäre es schön, zu erfahren, <em>warum</em> der Standardisierungsausschuss sich die Mühe machte, das da reinzuschreben...<br />
Es ist doch eher die Regel, dass die Standardvorgaben nicht zufällig entstanden sind (TROTZ Darwinjahr <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>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1703648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1703648</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 30 Apr 2009 14:08:24 GMT</pubDate></item><item><title><![CDATA[Reply to Lokale Klassen und templates: Warum kann man nicht beides haben? on Thu, 30 Apr 2009 14:43:28 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p><em>warum</em> der Standardisierungsausschuss sich die Mühe machte, das da reinzuschreben...</p>
</blockquote>
<p>Es ist doch eher andersrum. Im Standard ist explizit erlaubt, dass es lokale Klassen geben darf. Von lokalen Klassentemplates samt eventueller Instantiierung ist nirgendwo die Rede, deshalb wirds auch nicht implementiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1703663</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1703663</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 30 Apr 2009 14:43:28 GMT</pubDate></item><item><title><![CDATA[Reply to Lokale Klassen und templates: Warum kann man nicht beides haben? on Thu, 30 Apr 2009 17:17:34 GMT]]></title><description><![CDATA[<p>Werden lokale Klassen von euch eigentlich benutzt? Wenn ja, wozu? Vielleicht Funktoren?</p>
<p>Ich habe selber noch nie eine Klasse lokal definiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1703763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1703763</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 30 Apr 2009 17:17:34 GMT</pubDate></item><item><title><![CDATA[Reply to Lokale Klassen und templates: Warum kann man nicht beides haben? on Thu, 30 Apr 2009 17:23:29 GMT]]></title><description><![CDATA[<p>Bei mir nicht. Funktoren, also jetzt Klassen mit überladenem ()-Operator stehen bei mir (wenn's auch um STL geht) in einem eigenen Namensraum. Es gibt keinen Grund, eine Klasse in der main zu definieren, eine in einer Funktion zeigt auch noch verdammt schlechten Geschmack.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1703767</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1703767</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Thu, 30 Apr 2009 17:23:29 GMT</pubDate></item><item><title><![CDATA[Reply to Lokale Klassen und templates: Warum kann man nicht beides haben? on Thu, 30 Apr 2009 17:51:56 GMT]]></title><description><![CDATA[<p>Ad aCTa schrieb:</p>
<blockquote>
<p>Es gibt keinen Grund, eine Klasse in der main zu definieren, eine in einer Funktion zeigt auch noch verdammt schlechten Geschmack.</p>
</blockquote>
<p>ROFL<br />
Dann habe ich wohl verdammt schlechten Geschmack. Es ist bisher zwar noch nicht oft aufgetaucht, aber ich habe einmal eine Klasse benötigt, um genau zu sein ein struct als Visitor für ein Boost.Variant. Ich habe es nirgends ausser in dieser Funktion benötigt. Die Funktion hatte daher am Anfang eine Strukturdefinition und danach einen Funktionensaufruf und das Resultat wurde zurückgegeben.</p>
<p>Ich empfand dies als übersichtlicher. So war alles beisammen, was auch gleich zusammengehört. Überdimensionierter Lambda-Ausdruck <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/1703789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1703789</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 30 Apr 2009 17:51:56 GMT</pubDate></item><item><title><![CDATA[Reply to Lokale Klassen und templates: Warum kann man nicht beides haben? on Thu, 30 Apr 2009 21:43:36 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Simon2 schrieb:</p>
<blockquote>
<p><em>warum</em> der Standardisierungsausschuss sich die Mühe machte, das da reinzuschreben...</p>
</blockquote>
<p>Es ist doch eher andersrum. Im Standard ist explizit erlaubt, dass es lokale Klassen geben darf. Von lokalen Klassentemplates samt eventueller Instantiierung ist nirgendwo die Rede, deshalb wirds auch nicht implementiert.</p>
</blockquote>
<p>Ach so!<br />
Dann reicht es natürlich schon aus, wenn es niemand vermisst hat...</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1703906</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1703906</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 30 Apr 2009 21:43:36 GMT</pubDate></item><item><title><![CDATA[Reply to Lokale Klassen und templates: Warum kann man nicht beides haben? on Fri, 01 May 2009 01:06:39 GMT]]></title><description><![CDATA[<p>Ich bin mir fast sicher, dass das mit dem &quot;zusammenfassen&quot; von Template-Instanzen zu tun hat.</p>
<p>External-Linkage bedeutet nunmal dass ein &quot;Ding&quot; (Funktion, statische/globale Variable) einen eindeutigen &quot;Namen&quot; (oder &quot;ID&quot;) haben muss. Anhand dieses Namens können Template-Instanzen beim Linken schön zusammengefasst werden - indem man nämlich einfach eine x-beliebige Instanz pro Namen auswählt, und alle anderen wegwirft.<br />
Für &quot;normale&quot; Funktionen ist das verboten, für Templates (ausgenommen vollständig spezialisierte Funktionstemplates!) und &quot;inline&quot; Funktionen ist es aber erlaubt.</p>
<p>Templates mit Internal Linkage zu erlauben (und lokale Klassen haben Internal Linkage!) würde die Sache verkomplizieren.</p>
<p>Dasselbe gilt für Template-Parameter, weswegen dashier nicht geht:</p>
<pre><code class="language-cpp">void foo()
{
    class bar {};
    std::vector&lt;bar&gt; vec; // Fehler: Template-Parameter müssen External Linkage haben!
}
</code></pre>
<p>p.S.: weiss jemand, ob der Standard es erlaubt, lokale Klasse in inline-Funktionen zu verwenden? MSVC spuckt da nämlich Zahnräder (wenn die inline Funktion in &gt;= zwei TUs vorkommt - sonst nicht).<br />
Muss ich gleich nachgucken wenn ich zuhause bin...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1703944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1703944</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 01 May 2009 01:06:39 GMT</pubDate></item><item><title><![CDATA[Reply to Lokale Klassen und templates: Warum kann man nicht beides haben? on Fri, 01 May 2009 07:32:36 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Ad aCTa schrieb:</p>
<blockquote>
<p>Es gibt keinen Grund, eine Klasse in der main zu definieren, eine in einer Funktion zeigt auch noch verdammt schlechten Geschmack.</p>
</blockquote>
<p>ROFL<br />
Dann habe ich wohl verdammt schlechten Geschmack. Es ist bisher zwar noch nicht oft aufgetaucht, aber ich habe einmal eine Klasse benötigt, um genau zu sein ein struct als Visitor für ein Boost.Variant. Ich habe es nirgends ausser in dieser Funktion benötigt. Die Funktion hatte daher am Anfang eine Strukturdefinition und danach einen Funktionensaufruf und das Resultat wurde zurückgegeben.</p>
<p>Ich empfand dies als übersichtlicher. So war alles beisammen, was auch gleich zusammengehört. Überdimensionierter Lambda-Ausdruck <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>
</blockquote>
<p>Naja, ich dachte da mehr an Classes. Structs, enums und unions sind natürlich mehr Mittel zum Zweck, unter einer &quot;Klasse&quot; verstehe ich etwas größeres als ein Struct, die sind für mich mehr Transportmittel, so wie z.B. std::pair.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1703966</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1703966</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Fri, 01 May 2009 07:32:36 GMT</pubDate></item><item><title><![CDATA[Reply to Lokale Klassen und templates: Warum kann man nicht beides haben? on Fri, 01 May 2009 09:09:27 GMT]]></title><description><![CDATA[<p>Ad aCTa schrieb:</p>
<blockquote>
<p>Naja, ich dachte da mehr an Classes. Structs, enums und unions sind natürlich mehr Mittel zum Zweck, unter einer &quot;Klasse&quot; verstehe ich etwas größeres als ein Struct, die sind für mich mehr Transportmittel, so wie z.B. std::pair.</p>
</blockquote>
<p>Deine Definition des Unterschieds zwischen class und struct ist ein ziemlich persönlicher. Technisch sind struct und class das selbe - von dem kleinen Unterschied der default Sichtbarkeit mal abgesehn.</p>
<p>Natürlich wird niemand eine lokale Monsterklasse definieren. Denn das würde bedeuten dass man deren ganze Funktionalität in der Funktion bräuchte - was wiederum eine Monsterfunktion voraussetzt.</p>
<p>Da Funktionen normalerweise kurz gehalten werden, gilt das selber für lokale Klassen. Der häufigste Fall für lokale Klassen dürften Funktoren sein, die für Algorithmen benutzt werden.</p>
<p>Ich persönlich benutze lokale Klassen genau zu dem Zweck.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1703977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1703977</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 01 May 2009 09:09:27 GMT</pubDate></item></channel></rss>