<?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[partielle Spezialisierung von static Variablen]]></title><description><![CDATA[<p>Hallo,<br />
ich möchte eine Art Lookuptabelle mit Datentypen als Schlüssel. Das ganze habe ich durch eine Traits-Klasse realisiert:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
struct test_traits {
    static char const * const NAME;
};
template &lt;class T&gt; char const * const test_traits&lt;T&gt;::NAME = &quot;Default&quot;;
template &lt;&gt; char const * const test_traits&lt;float&gt;::NAME = &quot;FLOAT&quot;;
template &lt;class T&gt; char const * const test_traits&lt;typename std::enable_if&lt;std::is_integral&lt;T&gt;::value, T&gt;::type&gt;::NAME = &quot;INT&quot;;
</code></pre>
<p>Durch Spezialisierung wie in der vorletzen Zeile kann ich den einzelen Typen einen Wert zuweisen. Jedoch möchte ich nicht für alle integer Typen eine Spezialisierung schreiben und habe versucht über enable_if und is_integral eine partielle Spezialisierung für Integer-Typen zu realisieren, bekomme aber folgende Fehlermeldung beim compilieren:</p>
<blockquote>
<p>error: template definition of non-template 'const char* const test_traits&lt;typename std::enable_if&lt;std::is_integral&lt;_Tp&gt;::value, T&gt;::type&gt;::NAME'</p>
</blockquote>
<p>Ich verstehe nur nicht was mir diese Meldung sagen möchte, vor allem warum es ein 'non-template' ist. Andere Vorschläge, wie ich eine Lookuptabelle &lt;datantyp&gt; -&gt; &lt;string&gt; realisieren kann, sind auch willkommen.</p>
<p>Genutzt wird das ganze in einem Funktionstemplate:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
void test(T const &amp;x) {
    std::cout &lt;&lt; test_traits&lt;T&gt;::NAME &lt;&lt; std::endl;
}
</code></pre>
<p>Ich benutze gcc 4.6.1 mit '-std=c++0x'</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/300584/partielle-spezialisierung-von-static-variablen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 12 Aug 2026 17:21:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/300584.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 05 Mar 2012 23:28:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to partielle Spezialisierung von static Variablen on Mon, 05 Mar 2012 23:28:23 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich möchte eine Art Lookuptabelle mit Datentypen als Schlüssel. Das ganze habe ich durch eine Traits-Klasse realisiert:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
struct test_traits {
    static char const * const NAME;
};
template &lt;class T&gt; char const * const test_traits&lt;T&gt;::NAME = &quot;Default&quot;;
template &lt;&gt; char const * const test_traits&lt;float&gt;::NAME = &quot;FLOAT&quot;;
template &lt;class T&gt; char const * const test_traits&lt;typename std::enable_if&lt;std::is_integral&lt;T&gt;::value, T&gt;::type&gt;::NAME = &quot;INT&quot;;
</code></pre>
<p>Durch Spezialisierung wie in der vorletzen Zeile kann ich den einzelen Typen einen Wert zuweisen. Jedoch möchte ich nicht für alle integer Typen eine Spezialisierung schreiben und habe versucht über enable_if und is_integral eine partielle Spezialisierung für Integer-Typen zu realisieren, bekomme aber folgende Fehlermeldung beim compilieren:</p>
<blockquote>
<p>error: template definition of non-template 'const char* const test_traits&lt;typename std::enable_if&lt;std::is_integral&lt;_Tp&gt;::value, T&gt;::type&gt;::NAME'</p>
</blockquote>
<p>Ich verstehe nur nicht was mir diese Meldung sagen möchte, vor allem warum es ein 'non-template' ist. Andere Vorschläge, wie ich eine Lookuptabelle &lt;datantyp&gt; -&gt; &lt;string&gt; realisieren kann, sind auch willkommen.</p>
<p>Genutzt wird das ganze in einem Funktionstemplate:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
void test(T const &amp;x) {
    std::cout &lt;&lt; test_traits&lt;T&gt;::NAME &lt;&lt; std::endl;
}
</code></pre>
<p>Ich benutze gcc 4.6.1 mit '-std=c++0x'</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2188926</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2188926</guid><dc:creator><![CDATA[NomAnor]]></dc:creator><pubDate>Mon, 05 Mar 2012 23:28:23 GMT</pubDate></item><item><title><![CDATA[Reply to partielle Spezialisierung von static Variablen on Tue, 06 Mar 2012 12:47:44 GMT]]></title><description><![CDATA[<p>Ich habe eine funktionierende Lösung gefunden:</p>
<pre><code class="language-cpp">template &lt;class T, class Enabled = void&gt;
struct test_traits {
    inline static char const * const getName() { return &quot;Default&quot;; }
};

template &lt;class T&gt;
struct test_traits&lt;T, typename std::enable_if&lt;std::is_floating_point&lt;T&gt;::value &gt;::type&gt; {
    inline static char const * const getName() { return &quot;FLOAT&quot;; }
};

template &lt;class T&gt;
struct test_traits&lt;T, typename std::enable_if&lt;std::is_integral&lt;T&gt;::value &gt;::type&gt; {
    inline static char const * const getName() { return &quot;INT&quot;; }
};
</code></pre>
<p>Mich würde trotzdem interessieren, was genau an meinem ersten Code falsch ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2189045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2189045</guid><dc:creator><![CDATA[NomAnor]]></dc:creator><pubDate>Tue, 06 Mar 2012 12:47:44 GMT</pubDate></item><item><title><![CDATA[Reply to partielle Spezialisierung von static Variablen on Tue, 06 Mar 2012 17:36:34 GMT]]></title><description><![CDATA[<p>NomAnor schrieb:</p>
<blockquote>
<p>Mich würde trotzdem interessieren, was genau an meinem ersten Code falsch ist.</p>
</blockquote>
<p>Partiell spezialisiert werden können nur Klassentemplates, nicht aber statische Member von Klassentemplates.</p>
<p>Mit</p>
<pre><code class="language-cpp">template &lt;class T&gt; char const * const test_traits&lt;typename std::enable_if&lt;std::is_integral&lt;T&gt;::value, T&gt;::type&gt;::NAME = &quot;INT&quot;;
</code></pre>
<p>definierst du aber ein statisches Member einer partiellen Spezialisierung, die selbst nie definiert wurde. Das geht nat. nicht. (Anm. selbst wenn eine solche partielle Spezialisierung existieren würde, wäre sie nutzlos; weil das Templateargument nicht deduziert werden könnte).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2189181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2189181</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 06 Mar 2012 17:36:34 GMT</pubDate></item></channel></rss>