<?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[Static Template-Member explizit instantiieren]]></title><description><![CDATA[<p>Hallo,</p>
<p>nachdem ich mir das &quot;Modern C++ Design&quot; zu Gemüte geführt habe, bin ich ganz angetan von Policies.<br />
Aktuell scheitere ich aber seit längerem an folgender Situation: Ich habe eine Policy, die selber ein Template mit Template-Parameter T ist und darüber hinaus eine statische Variable vom Typ T hat. Eine Implementierungsklasse bekommt die Policy und den Typ T der Policy dann als Template-Parameter wie üblich:</p>
<pre><code class="language-cpp">// main.cpp
#include &quot;Impl.cpp&quot;
#include &quot;Policy.h&quot;

template class Impl&lt;Policy, int&gt;;
template&lt;&gt; int Policy&lt;int&gt;::val = 5;

int main()
{
	Impl&lt;Policy, int&gt;::bar();
}

// Impl.h
#ifndef IMPL_H_
#define IMPL_H_

template&lt;template &lt;class&gt; class P, class T&gt;
class Impl
{
public:
	Impl();
	~Impl();

	static void bar();
};
#endif /*IMPL_H_*/

// Impl.cpp
#include &quot;Impl.h&quot;
#include &lt;iostream&gt;

template&lt;template &lt;class&gt; class P, class T&gt;
Impl&lt;P, T&gt;::Impl()
{
}

template&lt;template &lt;class&gt; class P, class T&gt;
Impl&lt;P, T&gt;::~Impl()
{
}

template&lt;template &lt;class&gt; class P, class T&gt;
void Impl&lt;P, T&gt;::bar()
{
	P&lt;T&gt;::foo();
}

// Policy.h
#ifndef POLICY_H_
#define POLICY_H_

#include &lt;iostream&gt;

template&lt;typename T&gt;
class Policy
{
public:
	Policy() {};
	~Policy() {};	

	static void foo() {
		std::cout &lt;&lt; &quot;Policy foo(): &quot; &lt;&lt; val &lt;&lt; std::endl;
	};

	static T val;
};
#endif /*POLICY_H_*/
</code></pre>
<p>So wie es jetzt da steht klappt das wunderbar. Und ja, ich will statische Methoden verwenden.</p>
<p>Was mir nicht gefällt ist, dass ich in Zeile 6 den static Member der Policy explizit instantiieren muß, da ansonsten der Linker meckert (gcc 4.2.4)...<br />
Was ich gerne hätte wäre eine explizite Instanziierung der Policy im Bereich der Impl/Policy Klassen abhängig von deren Template Parametern (also insbesondere T).<br />
=&gt; Als &quot;Benutzer&quot; der Impl-Klasse möchte ich eigentlich nur max. diese explizit instantiieren, ohne etwas über die Interna der Policy wissen zu müssen.</p>
<p>Die Krönung wäre dann noch wenn für T nicht nur ein &quot;normaler&quot; Typ wie int, sondern eine allgemeine Klasse verwendet werden könnte. Nach meiner bisherigen Recherche scheint das aber Probleme zu machen (anscheinend klappt es nur mit einem Zeiger auf die Klasse...)?</p>
<p>Hat jemand einen Tipp für mich?</p>
<p>Danke,<br />
steginger</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/216224/static-template-member-explizit-instantiieren</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 13:44:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/216224.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 20 Jun 2008 19:26:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Static Template-Member explizit instantiieren on Fri, 20 Jun 2008 19:26:18 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>nachdem ich mir das &quot;Modern C++ Design&quot; zu Gemüte geführt habe, bin ich ganz angetan von Policies.<br />
Aktuell scheitere ich aber seit längerem an folgender Situation: Ich habe eine Policy, die selber ein Template mit Template-Parameter T ist und darüber hinaus eine statische Variable vom Typ T hat. Eine Implementierungsklasse bekommt die Policy und den Typ T der Policy dann als Template-Parameter wie üblich:</p>
<pre><code class="language-cpp">// main.cpp
#include &quot;Impl.cpp&quot;
#include &quot;Policy.h&quot;

template class Impl&lt;Policy, int&gt;;
template&lt;&gt; int Policy&lt;int&gt;::val = 5;

int main()
{
	Impl&lt;Policy, int&gt;::bar();
}

// Impl.h
#ifndef IMPL_H_
#define IMPL_H_

template&lt;template &lt;class&gt; class P, class T&gt;
class Impl
{
public:
	Impl();
	~Impl();

	static void bar();
};
#endif /*IMPL_H_*/

// Impl.cpp
#include &quot;Impl.h&quot;
#include &lt;iostream&gt;

template&lt;template &lt;class&gt; class P, class T&gt;
Impl&lt;P, T&gt;::Impl()
{
}

template&lt;template &lt;class&gt; class P, class T&gt;
Impl&lt;P, T&gt;::~Impl()
{
}

template&lt;template &lt;class&gt; class P, class T&gt;
void Impl&lt;P, T&gt;::bar()
{
	P&lt;T&gt;::foo();
}

// Policy.h
#ifndef POLICY_H_
#define POLICY_H_

#include &lt;iostream&gt;

template&lt;typename T&gt;
class Policy
{
public:
	Policy() {};
	~Policy() {};	

	static void foo() {
		std::cout &lt;&lt; &quot;Policy foo(): &quot; &lt;&lt; val &lt;&lt; std::endl;
	};

	static T val;
};
#endif /*POLICY_H_*/
</code></pre>
<p>So wie es jetzt da steht klappt das wunderbar. Und ja, ich will statische Methoden verwenden.</p>
<p>Was mir nicht gefällt ist, dass ich in Zeile 6 den static Member der Policy explizit instantiieren muß, da ansonsten der Linker meckert (gcc 4.2.4)...<br />
Was ich gerne hätte wäre eine explizite Instanziierung der Policy im Bereich der Impl/Policy Klassen abhängig von deren Template Parametern (also insbesondere T).<br />
=&gt; Als &quot;Benutzer&quot; der Impl-Klasse möchte ich eigentlich nur max. diese explizit instantiieren, ohne etwas über die Interna der Policy wissen zu müssen.</p>
<p>Die Krönung wäre dann noch wenn für T nicht nur ein &quot;normaler&quot; Typ wie int, sondern eine allgemeine Klasse verwendet werden könnte. Nach meiner bisherigen Recherche scheint das aber Probleme zu machen (anscheinend klappt es nur mit einem Zeiger auf die Klasse...)?</p>
<p>Hat jemand einen Tipp für mich?</p>
<p>Danke,<br />
steginger</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1533035</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1533035</guid><dc:creator><![CDATA[steginger]]></dc:creator><pubDate>Fri, 20 Jun 2008 19:26:18 GMT</pubDate></item><item><title><![CDATA[Reply to Static Template-Member explizit instantiieren on Fri, 20 Jun 2008 20:00:13 GMT]]></title><description><![CDATA[<p>Einfach die Sache in den Policy Header packen, dann geht das.</p>
<pre><code class="language-cpp">// Policy.h
#ifndef POLICY_H_
#define POLICY_H_

#include &lt;iostream&gt;

template&lt;typename T&gt;
class Policy
{
public:
    Policy() {};
    ~Policy() {};    

    static void foo() {
        std::cout &lt;&lt; &quot;Policy foo(): &quot; &lt;&lt; val &lt;&lt; std::endl;
    };

    static T val;
};

// Kannst du auch hier hin schreiben! Dann ist es allerdings uninitialisiert.
template&lt;typename T&gt;
T Policy&lt;T&gt;::val;

// Spezialisierungen sind auch möglich:
template&lt;&gt;
int Policy&lt;int&gt;::val = 6;

#endif /*POLICY_H_*/
</code></pre>
<p>Und man kann dann auch eine normale Klasse verwenden:</p>
<pre><code class="language-cpp">int main()
{
    // Zum Beispiel mit einem std::string.
    Impl&lt;Policy, std::string&gt;::bar();

    return 0;
}
</code></pre>
<p>Oder verstehe ich dich falsch?</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1533045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1533045</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 20 Jun 2008 20:00:13 GMT</pubDate></item><item><title><![CDATA[Reply to Static Template-Member explizit instantiieren on Fri, 20 Jun 2008 20:02:59 GMT]]></title><description><![CDATA[<p>steginger schrieb:</p>
<blockquote>
<p>Was mir nicht gefällt ist, dass ich in Zeile 6 den static Member der Policy explizit instantiieren muß, da ansonsten der Linker meckert (gcc 4.2.4)...</p>
</blockquote>
<p>Das ist keine Definition oder Instantiierung eines statischen Templatemembers sondern die Definition eines statischen Klassenmembers (die Klasse ist zufällig eine Templateklasse). Diese müsstest du auch ohne Templates durchführen, nicht zuletzt, um einen Initialisierer festzulegen.</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class Policy
{
public:
    Policy() {};
    ~Policy() {};   

    static void foo() {
        std::cout &lt;&lt; &quot;Policy foo(): &quot; &lt;&lt; val &lt;&lt; std::endl;
    };

    static T val;
};
template&lt;typename T&gt;
T Policy&lt;T&gt;::val;
</code></pre>
<p>ist evtl. das, was du willst.</p>
<blockquote>
<p>Was ich gerne hätte wäre eine explizite Instanziierung der Policy im Bereich der Impl/Policy Klassen abhängig von deren Template Parametern (also insbesondere T).<br />
=&gt; Als &quot;Benutzer&quot; der Impl-Klasse möchte ich eigentlich nur max. diese explizit instantiieren, ohne etwas über die Interna der Policy wissen zu müssen.</p>
<p>Die Krönung wäre dann noch wenn für T nicht nur ein &quot;normaler&quot; Typ wie int, sondern eine allgemeine Klasse verwendet werden könnte. Nach meiner bisherigen Recherche scheint das aber Probleme zu machen (anscheinend klappt es nur mit einem Zeiger auf die Klasse...)?</p>
<p>Hat jemand einen Tipp für mich?</p>
</blockquote>
<p>ich verstehe dein Problem nicht, demonstriere es doch einmal mit Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1533047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1533047</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 20 Jun 2008 20:02:59 GMT</pubDate></item><item><title><![CDATA[Reply to Static Template-Member explizit instantiieren on Fri, 20 Jun 2008 20:26:37 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>danke euch beiden. Mit</p>
<pre><code class="language-cpp">// Kannst du auch hier hin schreiben! Dann ist es allerdings uninitialisiert.
template&lt;typename T&gt;
T Policy&lt;T&gt;::val;
</code></pre>
<p>klappts, auch wenn T eine andere echte Klasse ist.</p>
<p>Irgendwann wird man anscheinend betriebsblind...<br />
Die Lösung habe ich im eigentlichen Code schon x-mal die letzten Tage rauf und runter probiert, aber immer &quot;Undefined references&quot; beim statischen Member bekommen.<br />
Beim Nachbauen in das kleine Beispiel hab' ich es anscheinend dann doch nicht mehr ausprobiert und prompt liegt der Fehler wohl in irgendeiner Kleinigkeit irgendwo drumherum. Sind noch ein paar andere Templates dabei, da kann sich noch genügend verstecken... <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>Danke nochmal,<br />
steginger</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1533051</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1533051</guid><dc:creator><![CDATA[steginger]]></dc:creator><pubDate>Fri, 20 Jun 2008 20:26:37 GMT</pubDate></item></channel></rss>