<?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[Instantiierung einer statischen Klassenvariable eines Templates]]></title><description><![CDATA[<p>Folgendes Beispiel illustriert mein Problem:</p>
<pre><code class="language-cpp">template &lt;class C&gt;
	class MyHelperBase
{
	struct instantiator_t
	{
		instantiator_t (void) {}
	};

	static instantiator_t instantiator;
};

class MyClass
{
protected:
	class MyHelper : private MyHelperBase &lt;MyHelper&gt;
	{
	};
};

template &lt;&gt; MyHelperBase &lt;MyClass::MyHelper&gt;::instantiator_t
	MyHelperBase &lt;MyClass::MyHelper&gt;::instantiator;
</code></pre>
<p>In den letzten Zeilen beklagen sich MSVC und Comeau, daß kein Zugriff auf MyClass::MyHelper besteht (was ja an sich korrekt ist). Nur weiß ich nicht, wie ich die statische Variable anders instantiieren könnte. Muß ich MyHelper nun doch public machen, oder ist die Instantiierung irgendwie aus dem Kontext von MyClass heraus möglich?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/202195/instantiierung-einer-statischen-klassenvariable-eines-templates</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 18:50:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/202195.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 08 Jan 2008 18:05:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Instantiierung einer statischen Klassenvariable eines Templates on Tue, 08 Jan 2008 18:05:32 GMT]]></title><description><![CDATA[<p>Folgendes Beispiel illustriert mein Problem:</p>
<pre><code class="language-cpp">template &lt;class C&gt;
	class MyHelperBase
{
	struct instantiator_t
	{
		instantiator_t (void) {}
	};

	static instantiator_t instantiator;
};

class MyClass
{
protected:
	class MyHelper : private MyHelperBase &lt;MyHelper&gt;
	{
	};
};

template &lt;&gt; MyHelperBase &lt;MyClass::MyHelper&gt;::instantiator_t
	MyHelperBase &lt;MyClass::MyHelper&gt;::instantiator;
</code></pre>
<p>In den letzten Zeilen beklagen sich MSVC und Comeau, daß kein Zugriff auf MyClass::MyHelper besteht (was ja an sich korrekt ist). Nur weiß ich nicht, wie ich die statische Variable anders instantiieren könnte. Muß ich MyHelper nun doch public machen, oder ist die Instantiierung irgendwie aus dem Kontext von MyClass heraus möglich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1433216</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1433216</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Tue, 08 Jan 2008 18:05:32 GMT</pubDate></item><item><title><![CDATA[Reply to Instantiierung einer statischen Klassenvariable eines Templates on Tue, 08 Jan 2008 18:24:05 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>Folgendes Beispiel illustriert mein Problem:</p>
<pre><code class="language-cpp">template &lt;class C&gt;
	class MyHelperBase
{
	struct instantiator_t
	{
		instantiator_t (void) {}
	};

	static instantiator_t instantiator;
};

class MyClass
{
protected:
	class MyHelper : private MyHelperBase &lt;MyHelper&gt;
	{
	};
};

template &lt;&gt; MyHelperBase &lt;MyClass::MyHelper&gt;::instantiator_t
    MyHelperBase &lt;MyClass::MyHelper&gt;::instantiator;
</code></pre>
<p>In den letzten Zeilen beklagen sich MSVC und Comeau, daß kein Zugriff auf MyClass::MyHelper besteht (was ja an sich korrekt ist). Nur weiß ich nicht, wie ich die statische Variable anders instantiieren könnte. Muß ich MyHelper nun doch public machen, oder ist die Instantiierung irgendwie aus dem Kontext von MyClass heraus möglich?</p>
</blockquote>
<p>Hier definierst du instantiator nur für eine bestimmte Spezialisierung des MyHelperBase-Templates. Eine andere Möglichkeit ist die Definition des Members für das gesamte Template - damit umgehst du die Zugriffskontrolle bei den Templateargumenten (und die Definition darf auch im Header stehen).</p>
<pre><code class="language-cpp">template &lt;class C&gt; typename MyHelperBase &lt;C&gt;::instantiator_t MyHelperBase &lt;C&gt;::instantiator;
</code></pre>
<p>Etwas schwieriger wird es, wenn noch ein initialisierender Ausdruck dazukommen soll - eine Möglichkeit wäre, hierfür eine extra Templatefunktion zu benutzen und diese für die tatsächlich vorkommenden Templateargumente zu spezialisieren und ggf. als friend von MyCass zu deklarieren (oder sie ist gleich ein statischer Member).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1433227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1433227</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 08 Jan 2008 18:24:05 GMT</pubDate></item><item><title><![CDATA[Reply to Instantiierung einer statischen Klassenvariable eines Templates on Tue, 08 Jan 2008 19:26:26 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Hier definierst du instantiator nur für eine bestimmte Spezialisierung des MyHelperBase-Templates. Eine andere Möglichkeit ist die Definition des Members für das gesamte Template - damit umgehst du die Zugriffskontrolle bei den Templateargumenten (und die Definition darf auch im Header stehen).</p>
</blockquote>
<p>Das wäre natürlich die naheliegendste Lösung - aber leider funktioniert es nicht. Oder wird bei dir in folgendem Beispiel instantiator_t::instantiator_t() erreicht?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template &lt;class C&gt;
	class MyHelperBase
{
	struct instantiator_t
	{
		instantiator_t (void) { std::cout &lt;&lt; &quot;Here I am&quot; &lt;&lt; std::endl; }
	};

	static instantiator_t instantiator;
};

template &lt;class C&gt;
	typename MyHelperBase &lt;C&gt;::instantiator_t MyHelperBase &lt;C&gt;::instantiator;

class MyClass
{
protected:
	class MyHelper : private MyHelperBase &lt;MyHelper&gt;
	{
	};
};

int main (void)
{
}
</code></pre>
<p>Woran das liegt, weiß ich nicht. Jedenfalls verhalten sich MSVC und BCC hier gleich ruhig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1433262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1433262</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Tue, 08 Jan 2008 19:26:26 GMT</pubDate></item><item><title><![CDATA[Reply to Instantiierung einer statischen Klassenvariable eines Templates on Tue, 08 Jan 2008 20:31:42 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>Das wäre natürlich die naheliegendste Lösung - aber leider funktioniert es nicht. Oder wird bei dir in folgendem Beispiel instantiator_t::instantiator_t() erreicht?</p>
</blockquote>
<p>Natürlich nicht. Für welche C denn? Instantiieren musst du es natürlich noch (eine implizite Instantiierung einer Templateklasse instantiiert ja nicht statische Member) - das ist aber nicht an so strikte Vorausetzungen (Die Definition muss ja in einem umliegenden Namensraum erfolgen) gebunden und insofern einfach genug.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1433293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1433293</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 08 Jan 2008 20:31:42 GMT</pubDate></item><item><title><![CDATA[Reply to Instantiierung einer statischen Klassenvariable eines Templates on Tue, 08 Jan 2008 22:00:51 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>(eine implizite Instantiierung einer Templateklasse instantiiert ja nicht statische Member)</p>
</blockquote>
<p>Gut zu wissen; das erklärt dieses Verhalten.</p>
<p>camper schrieb:</p>
<blockquote>
<p>das ist aber nicht an so strikte Vorausetzungen (Die Definition muss ja in einem umliegenden Namensraum erfolgen) gebunden und insofern einfach genug.</p>
</blockquote>
<p>Das versuche ich nun schon eine ganze Weile, bisher ohne Erfolg. Wie geht das denn so einfach?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1433329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1433329</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Tue, 08 Jan 2008 22:00:51 GMT</pubDate></item><item><title><![CDATA[Reply to Instantiierung einer statischen Klassenvariable eines Templates on Wed, 09 Jan 2008 13:32:16 GMT]]></title><description><![CDATA[<p>Ich habe es jetzt gelöst, indem ich MyHelperBase &lt;MyHelper&gt; innerhalb von MyClass als friend deklariert habe. Das ist zwar suboptimal, aber etwas besseres finde ich momentan nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1433641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1433641</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Wed, 09 Jan 2008 13:32:16 GMT</pubDate></item><item><title><![CDATA[Reply to Instantiierung einer statischen Klassenvariable eines Templates on Wed, 06 Feb 2008 18:05:36 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>das ist aber nicht an so strikte Vorausetzungen (Die Definition muss ja in einem umliegenden Namensraum erfolgen) gebunden und insofern einfach genug.</p>
</blockquote>
<p>Das versuche ich nun schon eine ganze Weile, bisher ohne Erfolg. Wie geht das denn so einfach?</p>
</blockquote>
<p>Ein statischer Member wird implizit instantiiert, wen er in einer Weise benutzt wird, die die Existenz der Definition voraussetzt. Der einfachste Weg, der mir dazu einfällt, ist die Bestimmung der Adresse des Members.<br />
Um die Adresse eines Objektes bestimmen zu können, muss dieses existieren, mithin definiert worden sein.<br />
Das können wir ausnutzen, falls wir irgendeine Funktion haben, die sowieso implizit instantiiert wird. Eine nahe liegende Wahl ist der Destruktor - falls wir irgendwann einmal ein Objekt der Klasse benötigen, wird es sicherlich auch irgendwo zerstört werden, und dabei wird der Destruktor ggf. implizit instantiiert, einfach einen Ausdruck einfügen, der die Adresse bestimmt (dieser hat im Übrigen keine Seiteneffekte und erzeugt trivialerweise keinen Overhead - das bedeutet aber nicht, dass hier keine Nutzung vorliegt und der Compiler die Instantiierung einfach wegoptimieren darf):</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;typename T&gt;
struct foo {
    ~foo() { &amp;x; }  // &lt;&lt;==, instantiiert implizit x
    static foo&lt;T&gt; x;
};

template&lt;typename T&gt;
foo&lt;T&gt; make_foo() { std::cout &lt;&lt; &quot;make_foo\n&quot;; return foo&lt;T&gt;(); }

template&lt;typename T&gt;
foo&lt;T&gt; foo&lt;T&gt;::x = make_foo&lt;T&gt;();

int main()
{
    foo&lt;int&gt; a; // instantiiert implizit (neben anderen) foo&lt;int&gt;::~foo
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1450748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1450748</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 06 Feb 2008 18:05:36 GMT</pubDate></item></channel></rss>