<?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[geschachtelte template Klassen mit statischen Datenmember und Spezialisierung in g++]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein merkwürdiges Verhalten von g++ (v4.2.3) entdeckt. Ich vermute es handelt sich um einen compiler bug - aber ich möchte die Sache erstmal zur Diskussion stellen, bevor ich einen bug report einsende.</p>
<p>Hier der Problemcode:</p>
<p>#include &lt;iostream&gt;</p>
<p>using namespace std;</p>
<p>template&lt; unsigned int D &gt;<br />
struct A<br />
{<br />
template&lt; unsigned int Mask &gt;<br />
struct B<br />
{<br />
static const int value = Mask;<br />
};</p>
<p>template&lt; unsigned int Mask &gt;<br />
struct C : public B&lt; Mask &gt; {};<br />
};</p>
<p>/*<br />
* specialize inner struct B for a template argument of the outer struct A.<br />
* -- should have no effect<br />
*/<br />
template&lt;&gt;<br />
template&lt; unsigned int Mask &gt;<br />
struct A&lt; 3 &gt;::B&lt; Mask &gt;<br />
{<br />
static const int value = Mask;<br />
};</p>
<p>const unsigned int mask = 1;</p>
<p>int main()<br />
{<br />
cout &lt;&lt; A&lt; 2 &gt;::B&lt; mask &gt;::value &lt;&lt; endl // 1 - as expected<br />
&lt;&lt; A&lt; 2 &gt;::C&lt; mask &gt;::value &lt;&lt; endl // 1 - as expected<br />
&lt;&lt; A&lt; 3 &gt;::B&lt; mask &gt;::value &lt;&lt; endl // 1 - as expected<br />
&lt;&lt; A&lt; 3 &gt;::C&lt; mask &gt;::value &lt;&lt; endl; // 3 - ???</p>
<p>return 0;<br />
}</p>
<p>Ich habe also zwei geschachtelte template Klassen und möchte die innere Klasse für ein template Argument der äußeren Klasse spezialisieren. Ich finde den Code logisch - allerdings weiß ich nicht, ob er Standardkonform ist. Evtl. ist es nötig die komplette Klasse A für das Argument '3' nochmal neu zu schreiben (eine perfekte 1:1-Kopie), damit ich die innere Klasse spezialisieren kann.<br />
Allerdings: weder der Intel- noch der Sun-Compiler haben Probleme mit diesem Code - beide geben auch beim letzten cout eine '1' aus.</p>
<p>Also: habe ich hier einen g++ bug oder nicht Standard-konformen Code?</p>
<p>mfg,<br />
cathune</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/224291/geschachtelte-template-klassen-mit-statischen-datenmember-und-spezialisierung-in-g</link><generator>RSS for Node</generator><lastBuildDate>Fri, 02 Oct 2026 17:32:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/224291.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 07 Oct 2008 23:58:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to geschachtelte template Klassen mit statischen Datenmember und Spezialisierung in g++ on Tue, 07 Oct 2008 23:58:23 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein merkwürdiges Verhalten von g++ (v4.2.3) entdeckt. Ich vermute es handelt sich um einen compiler bug - aber ich möchte die Sache erstmal zur Diskussion stellen, bevor ich einen bug report einsende.</p>
<p>Hier der Problemcode:</p>
<p>#include &lt;iostream&gt;</p>
<p>using namespace std;</p>
<p>template&lt; unsigned int D &gt;<br />
struct A<br />
{<br />
template&lt; unsigned int Mask &gt;<br />
struct B<br />
{<br />
static const int value = Mask;<br />
};</p>
<p>template&lt; unsigned int Mask &gt;<br />
struct C : public B&lt; Mask &gt; {};<br />
};</p>
<p>/*<br />
* specialize inner struct B for a template argument of the outer struct A.<br />
* -- should have no effect<br />
*/<br />
template&lt;&gt;<br />
template&lt; unsigned int Mask &gt;<br />
struct A&lt; 3 &gt;::B&lt; Mask &gt;<br />
{<br />
static const int value = Mask;<br />
};</p>
<p>const unsigned int mask = 1;</p>
<p>int main()<br />
{<br />
cout &lt;&lt; A&lt; 2 &gt;::B&lt; mask &gt;::value &lt;&lt; endl // 1 - as expected<br />
&lt;&lt; A&lt; 2 &gt;::C&lt; mask &gt;::value &lt;&lt; endl // 1 - as expected<br />
&lt;&lt; A&lt; 3 &gt;::B&lt; mask &gt;::value &lt;&lt; endl // 1 - as expected<br />
&lt;&lt; A&lt; 3 &gt;::C&lt; mask &gt;::value &lt;&lt; endl; // 3 - ???</p>
<p>return 0;<br />
}</p>
<p>Ich habe also zwei geschachtelte template Klassen und möchte die innere Klasse für ein template Argument der äußeren Klasse spezialisieren. Ich finde den Code logisch - allerdings weiß ich nicht, ob er Standardkonform ist. Evtl. ist es nötig die komplette Klasse A für das Argument '3' nochmal neu zu schreiben (eine perfekte 1:1-Kopie), damit ich die innere Klasse spezialisieren kann.<br />
Allerdings: weder der Intel- noch der Sun-Compiler haben Probleme mit diesem Code - beide geben auch beim letzten cout eine '1' aus.</p>
<p>Also: habe ich hier einen g++ bug oder nicht Standard-konformen Code?</p>
<p>mfg,<br />
cathune</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1595205</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1595205</guid><dc:creator><![CDATA[cathune]]></dc:creator><pubDate>Tue, 07 Oct 2008 23:58:23 GMT</pubDate></item><item><title><![CDATA[Reply to geschachtelte template Klassen mit statischen Datenmember und Spezialisierung in g++ on Wed, 08 Oct 2008 13:01:47 GMT]]></title><description><![CDATA[<p>Sieht wie ein Bug aus. Tritt er auch auf, wenn du auf die (zumindest hier nicht sonderlich sinnvolle) partielle Spezialisierung von A&lt;3&gt;::B verzichtest, und statt dessen A&lt;3&gt;::B neu definierst? Also</p>
<pre><code class="language-cpp">template&lt;&gt;
template&lt; unsigned int Mask &gt;
struct A&lt; 3 &gt;::B
{
static const int value = Mask;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1595493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1595493</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 08 Oct 2008 13:01:47 GMT</pubDate></item></channel></rss>