<?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[Konstanten mit Templates]]></title><description><![CDATA[<p>Im Prinzip möchte ich gerne, das der Klassentyp eine Id erhält auf die ich dann reagieren kann.</p>
<pre><code class="language-cpp">class B:public A&lt;double,1&gt;{};
class C:public A&lt;float,2&gt;{};

void foo(int id)
{
  const int q = B::Id; //ok

  switch(id)
  {
    case B::Id://error C2051
      //...
      break;
    case C::Id://error C2051
     //...
      break;
  }   
}
</code></pre>
<p>Ich bin soweit gekommen</p>
<pre><code class="language-cpp">template&lt;class T,const int i&gt; class A
{
  static const int Id;
};
template&lt;class T,const int i&gt; const int A&lt;T,i&gt;::Id(i);
</code></pre>
<p>Der Compiler meckert bei switch/case immer</p>
<pre><code>error C2051: case expression not constant
</code></pre>
<p>kann man das irgendwie lösen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/202894/konstanten-mit-templates</link><generator>RSS for Node</generator><lastBuildDate>Wed, 07 Oct 2026 04:17:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/202894.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 16 Jan 2008 15:13:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konstanten mit Templates on Wed, 16 Jan 2008 15:13:08 GMT]]></title><description><![CDATA[<p>Im Prinzip möchte ich gerne, das der Klassentyp eine Id erhält auf die ich dann reagieren kann.</p>
<pre><code class="language-cpp">class B:public A&lt;double,1&gt;{};
class C:public A&lt;float,2&gt;{};

void foo(int id)
{
  const int q = B::Id; //ok

  switch(id)
  {
    case B::Id://error C2051
      //...
      break;
    case C::Id://error C2051
     //...
      break;
  }   
}
</code></pre>
<p>Ich bin soweit gekommen</p>
<pre><code class="language-cpp">template&lt;class T,const int i&gt; class A
{
  static const int Id;
};
template&lt;class T,const int i&gt; const int A&lt;T,i&gt;::Id(i);
</code></pre>
<p>Der Compiler meckert bei switch/case immer</p>
<pre><code>error C2051: case expression not constant
</code></pre>
<p>kann man das irgendwie lösen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1437739</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1437739</guid><dc:creator><![CDATA[idefix]]></dc:creator><pubDate>Wed, 16 Jan 2008 15:13:08 GMT</pubDate></item><item><title><![CDATA[Reply to Konstanten mit Templates on Wed, 16 Jan 2008 15:22:14 GMT]]></title><description><![CDATA[<p>eine statische Membervariable ist keine Compilezeit-Konstante (besonders wenn sie nicht direkt initialisiert wurde) - und damit nicht als case-Marke geeignet.<br />
(für die Initialisierung von lokalen Konstanten kann der Compiler auch Laufzeit-Konstanten (und sogar Variablen) verwenden)</p>
<p>Eventuell könntest du mit einem enum arbeiten - dessen Wert(e) ist eine Compilezeit-Konstante:</p>
<pre><code class="language-cpp">template&lt;typename T,int i&gt;
class A
{
  enum{Id = i};
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1437747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1437747</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 16 Jan 2008 15:22:14 GMT</pubDate></item><item><title><![CDATA[Reply to Konstanten mit Templates on Wed, 16 Jan 2008 15:28:20 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt;class T, const int i&gt; class A //das const hier kannst du dir sparen, i ist sowieso nicht veränderbar.
{
  static const int Id = i;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1437755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1437755</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Wed, 16 Jan 2008 15:28:20 GMT</pubDate></item><item><title><![CDATA[Reply to Konstanten mit Templates on Wed, 16 Jan 2008 15:44:38 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>eine statische Membervariable ist keine Compilezeit-Konstante</p>
</blockquote>
<p>queer_boy's Variante funktioniert.</p>
<blockquote>
<p>(besonders wenn sie nicht direkt initialisiert wurde)</p>
</blockquote>
<p>ja, was denn nun? und was soll &quot;nicht direkt initialisiert&quot; überhaupt bedeuten?</p>
<blockquote>
<p>Eventuell könntest du mit einem enum arbeiten - dessen Wert(e) ist eine Compilezeit-Konstante:</p>
<pre><code class="language-cpp">template&lt;typename T,int i&gt;
class A
{
  enum{Id = i};
};
</code></pre>
</blockquote>
<p>Ja, Aufzählungskonstanten können in konstanten Ausdrücken auftreten, das gilt aber eben auch für statische integrale Member, die mit konstanten Ausdrücken initialisiert wurden. Das Ganze hat offenbar speziell etwas mit Templats zu tun, statische Member eines Templates werden nicht instantiiert (insbesondere findet deren Initialisierung nicht statt, solange die Member nicht in einer Weise gebraucht werden, die die Existenz der Definition voraussetzt). Das bedeutet, dass selbst eine explizite Instantiierung des Members nicht hilft (eine explizite Spezialisierung hilft dagegen - dann haben wir es ja nicht mehr mit einer template-Deklaration zu tun). Weil ein case-Label einen konstanten Ausdruck voraussetzt, und das Auftreten eines statischen integralen Members in einem solchen Ausdruck keine &quot;Benutzung&quot; des Members im Sinne von 3.2/2 darstellt, bewirkt es keine Instantiierung desselben - obwohl wir für die Berechnung des Ausdrucks auf diese Instantiierung angewiesen sind.<br />
-- Das ist bis jetzt meine Interpretation des Problems - die mich selbst allerdings nicht besonders überzeugt <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/1437777</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1437777</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 16 Jan 2008 15:44:38 GMT</pubDate></item><item><title><![CDATA[Reply to Konstanten mit Templates on Wed, 16 Jan 2008 15:47:16 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>eine statische Membervariable ist keine Compilezeit-Konstante</p>
</blockquote>
<p>queer_boy's Variante funktioniert.</p>
<blockquote>
<p>(besonders wenn sie nicht direkt initialisiert wurde)</p>
</blockquote>
<p>ja, was denn nun? und was soll &quot;nicht direkt initialisiert&quot; überhaupt bedeuten?</p>
</blockquote>
<p>Damit meinte ich, daß idefix die Variable außerhalb der Klassenfunktion initialisiert hatte. (und afaik unterstützt auch nicht jeder Compiler queer_boy's Variante)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1437781</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1437781</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 16 Jan 2008 15:47:16 GMT</pubDate></item><item><title><![CDATA[Reply to Konstanten mit Templates on Wed, 16 Jan 2008 17:07:14 GMT]]></title><description><![CDATA[<p>Das ist richtig Panne, das ich da nicht selber drauf kam.</p>
<pre><code class="language-cpp">template&lt;class T, const int i&gt; class A 
{
  static const int Id = i;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1437862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1437862</guid><dc:creator><![CDATA[idefix]]></dc:creator><pubDate>Wed, 16 Jan 2008 17:07:14 GMT</pubDate></item></channel></rss>