<?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[Templates: undefined reference (g++-3.3 vs. g++-4.1) [gelöst]]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>Ich versuche jetzt schon seit Stunden ältere Sourcen (sind auch von mir) für den g++-4.x fit zu machen, dabei bekomme ich immer folgenden Fehler beim linken geliefert:</p>
<pre><code>LINKER: undefined reference to `TbaSingleton&lt;TbaHostEnvLock&gt;::m_csUsageCounter'
</code></pre>
<p>Der Ürsprüngliche Code könnte mit Microsoft VC6.0 und unter LINUX mit dem g++-3.3 übersetzt werden.</p>
<pre><code class="language-cpp">H-FILE TEMPLATE (kein CPP-FILE vorhanden, weil Template):
template&lt;class TYPE&gt; class TbaSingleton
{
    ....................

private:
    static unsigned int m_nUsageCounter;
    static TbaCritSection m_csUsageCounter;
    static TYPE* M_pObject;
};

H-FILE ABGELEITETE KLASSE:
class TbaHostEnvLock : public TbaSingleton&lt;TbaHostEnvLock&gt;
{
    friend class TbaSingleton&lt;TbaHostEnvLock&gt;;
    ............
};

CPP-FILE ABGELEITETE KLASSE:
.............
unsigned int TbaSingleton&lt;TbaHostEnvLock&gt;::m_nUsageCounter = 0;
TbaCritSection TbaSingleton&lt;TbaHostEnvLock&gt;::m_csUsageCounter;
TbaHostEnvLock* TbaSingleton&lt;TbaHostEnvLock&gt;::M_pObject = NULL;
.............
</code></pre>
<p>So das Schlüsselwort</p>
<pre><code>template&lt;&gt;
</code></pre>
<p>fehlte, also Code geändert:</p>
<pre><code class="language-cpp">template&lt;&gt; unsigned int TbaSingleton&lt;TbaHostEnvLock&gt;::m_nUsageCounter = 0;
template&lt;&gt; TbaCritSectionTbaSingleton&lt;TbaHostEnvLock&gt;::m_csUsageCounter;
template&lt;&gt; TbaHostEnvLock* TbaSingleton&lt;TbaHostEnvLock&gt;::M_pObject = NULL;
</code></pre>
<p>Nach dieser Änderung kann weder mit dem g++ 3.3 noch einem 4.x übersetzt werden.</p>
<pre><code class="language-cpp">template&lt;&gt; unsigned int TbaSingleton&lt;TbaHostEnvLock&gt;::m_nUsageCounter = 0;
TbaCritSection TbaSingleton&lt;TbaHostEnvLock&gt;::m_csUsageCounter;
template&lt;&gt; TbaHostEnvLock* TbaSingleton&lt;TbaHostEnvLock&gt;::M_pObject = NULL;
</code></pre>
<p>Wenn ich jedoch das template&lt;&gt; for TbaSingleton entferne, dann kann ich noch mit dem g++-3.3 übersetzen.</p>
<p>Zur Info:<br />
TbaCritSection ist eine ganz normale Klasse für die H-FILE und CPP-FILE vorhanden sind.</p>
<p>Hat jemand eine Idee, felchen Fehler ich hier gemacht habe.</p>
<p>Danke Mauze</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/263599/templates-undefined-reference-g-3-3-vs-g-4-1-gelöst</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 14:27:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/263599.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 23 Mar 2010 11:13:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Templates: undefined reference (g++-3.3 vs. g++-4.1) [gelöst] on Fri, 26 Mar 2010 11:48:34 GMT]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>Ich versuche jetzt schon seit Stunden ältere Sourcen (sind auch von mir) für den g++-4.x fit zu machen, dabei bekomme ich immer folgenden Fehler beim linken geliefert:</p>
<pre><code>LINKER: undefined reference to `TbaSingleton&lt;TbaHostEnvLock&gt;::m_csUsageCounter'
</code></pre>
<p>Der Ürsprüngliche Code könnte mit Microsoft VC6.0 und unter LINUX mit dem g++-3.3 übersetzt werden.</p>
<pre><code class="language-cpp">H-FILE TEMPLATE (kein CPP-FILE vorhanden, weil Template):
template&lt;class TYPE&gt; class TbaSingleton
{
    ....................

private:
    static unsigned int m_nUsageCounter;
    static TbaCritSection m_csUsageCounter;
    static TYPE* M_pObject;
};

H-FILE ABGELEITETE KLASSE:
class TbaHostEnvLock : public TbaSingleton&lt;TbaHostEnvLock&gt;
{
    friend class TbaSingleton&lt;TbaHostEnvLock&gt;;
    ............
};

CPP-FILE ABGELEITETE KLASSE:
.............
unsigned int TbaSingleton&lt;TbaHostEnvLock&gt;::m_nUsageCounter = 0;
TbaCritSection TbaSingleton&lt;TbaHostEnvLock&gt;::m_csUsageCounter;
TbaHostEnvLock* TbaSingleton&lt;TbaHostEnvLock&gt;::M_pObject = NULL;
.............
</code></pre>
<p>So das Schlüsselwort</p>
<pre><code>template&lt;&gt;
</code></pre>
<p>fehlte, also Code geändert:</p>
<pre><code class="language-cpp">template&lt;&gt; unsigned int TbaSingleton&lt;TbaHostEnvLock&gt;::m_nUsageCounter = 0;
template&lt;&gt; TbaCritSectionTbaSingleton&lt;TbaHostEnvLock&gt;::m_csUsageCounter;
template&lt;&gt; TbaHostEnvLock* TbaSingleton&lt;TbaHostEnvLock&gt;::M_pObject = NULL;
</code></pre>
<p>Nach dieser Änderung kann weder mit dem g++ 3.3 noch einem 4.x übersetzt werden.</p>
<pre><code class="language-cpp">template&lt;&gt; unsigned int TbaSingleton&lt;TbaHostEnvLock&gt;::m_nUsageCounter = 0;
TbaCritSection TbaSingleton&lt;TbaHostEnvLock&gt;::m_csUsageCounter;
template&lt;&gt; TbaHostEnvLock* TbaSingleton&lt;TbaHostEnvLock&gt;::M_pObject = NULL;
</code></pre>
<p>Wenn ich jedoch das template&lt;&gt; for TbaSingleton entferne, dann kann ich noch mit dem g++-3.3 übersetzen.</p>
<p>Zur Info:<br />
TbaCritSection ist eine ganz normale Klasse für die H-FILE und CPP-FILE vorhanden sind.</p>
<p>Hat jemand eine Idee, felchen Fehler ich hier gemacht habe.</p>
<p>Danke Mauze</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1872876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872876</guid><dc:creator><![CDATA[Mauze]]></dc:creator><pubDate>Fri, 26 Mar 2010 11:48:34 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: undefined reference (g++-3.3 vs. g++-4.1) [gelöst] on Tue, 23 Mar 2010 11:59:08 GMT]]></title><description><![CDATA[<p>(ignore)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1872883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872883</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Tue, 23 Mar 2010 11:59:08 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: undefined reference (g++-3.3 vs. g++-4.1) [gelöst] on Tue, 23 Mar 2010 12:17:58 GMT]]></title><description><![CDATA[<p>rüdiger schrieb:</p>
<blockquote>
<p>(ignore)</p>
</blockquote>
<p>Leider kann ich mit dieser Antwort nichts anfangen.</p>
<p>Ich denke, das ich eine normale Frage gestellt habe oder ???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1872898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872898</guid><dc:creator><![CDATA[Mauze]]></dc:creator><pubDate>Tue, 23 Mar 2010 12:17:58 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: undefined reference (g++-3.3 vs. g++-4.1) [gelöst] on Tue, 23 Mar 2010 12:19:26 GMT]]></title><description><![CDATA[<p>Mauze schrieb:</p>
<blockquote>
<p>rüdiger schrieb:</p>
<blockquote>
<p>(ignore)</p>
</blockquote>
<p>Leider kann ich mit dieser Antwort nichts anfangen.</p>
<p>Ich denke, das ich eine normale Frage gestellt habe oder ???</p>
</blockquote>
<p>Sorry, das bezog sich auf meinen Beitrag. Hatte Blödsinn geschrieben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1872900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872900</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Tue, 23 Mar 2010 12:19:26 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: undefined reference (g++-3.3 vs. g++-4.1) [gelöst] on Tue, 23 Mar 2010 12:29:04 GMT]]></title><description><![CDATA[<p>Einmal heißt das Template bei dir <code>TbaSingleton</code> und einmal <code>TbaSingleton_NoTrace</code> . Und wenn Letzteres eine Klasse ist, wieso gibts du dafür Template-Parameter an?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1872901</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872901</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Tue, 23 Mar 2010 12:29:04 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: undefined reference (g++-3.3 vs. g++-4.1) [gelöst] on Tue, 23 Mar 2010 12:52:35 GMT]]></title><description><![CDATA[<p>Hatte ich gerade schon geändert, das hatte ich nur falsch hier eingestellt.</p>
<p>Der Code läuft seit einigen Jahren. Das mit dem _NoTrace hinter jeder Klasse ist so,<br />
das ich durch den Präprozessor alles 2 mal erzeugen lasse. Einmal für &quot;KLASSE&quot; und einmal für &quot;KLASSE_NoTrace&quot;.</p>
<p>Die Programmierer die meine Libraryfunktionen verwenden, verwenden nie die _NoTrace Klasse und können zur Laufzeit einen Trace aktivieren,<br />
der dann in einen Logfile schreibt oder der TCP-Server diesen Trace zur Verfügung stellt.</p>
<p>Da ich für den TCP LogServer selber meine Library benutzen, dürfen diese Klassen ja zur Laufzeit keine Trace ausgeben - der Programmierer<br />
will ja nur seinen Trace sehen. Darum werden alle Klassen 2 mal übersetzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1872916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872916</guid><dc:creator><![CDATA[Mauze]]></dc:creator><pubDate>Tue, 23 Mar 2010 12:52:35 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: undefined reference (g++-3.3 vs. g++-4.1) [gelöst] on Tue, 23 Mar 2010 13:17:42 GMT]]></title><description><![CDATA[<p>Noch etwas Erklärung zum Code:</p>
<p>Das &quot;template&lt;class TYPE&gt; class TbaSingleton&quot; stellt die Basis für eine Singleton-Implementierung.<br />
In dieser Klasse kann man mit GetObject() und ReleaseObject() auf das eigentliche Objekt zugreifen,<br />
darum gibt es ein Objekt und einen Zähler für die Anzahl wie oft es jetzt verwendet wird:</p>
<pre><code class="language-cpp">static unsigned int m_nUsageCounter;
static TYPE* M_pObject;
</code></pre>
<p>GetObject() und ReleaseObject() bearbeiten den Objektzähler. Damit dieser geschützt ist, ist dieser in einer CriticalSection bzw. Mutex.<br />
Pro Singleton Klasse gibt dafür ein eigenes Objekt:</p>
<pre><code class="language-cpp">static TbaCritSection m_csUsageCounter
</code></pre>
<p>Und genau dieses Objekt fehlt dem Linker dann:</p>
<pre><code class="language-cpp">template&lt;&gt; TbaCritSection TbaSingleton&lt;TbaHostEnvLock&gt;::m_csUsageCounter;
</code></pre>
<p>Wenn ich das template&lt;&gt; bei g++-3.3 nicht benutze dann funktioniert es.</p>
<pre><code class="language-cpp">/* template&lt;&gt; */ TbaCritSection TbaSingleton&lt;TbaHostEnvLock&gt;::m_csUsageCounter;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1872930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872930</guid><dc:creator><![CDATA[Mauze]]></dc:creator><pubDate>Tue, 23 Mar 2010 13:17:42 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: undefined reference (g++-3.3 vs. g++-4.1) [gelöst] on Fri, 26 Mar 2010 10:15:17 GMT]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>Ich habe das Problem mal auf ein minimum reduziert.<br />
(Allerdings macht der Code keinen Sinn mehr)</p>
<pre><code class="language-cpp">#include &lt;cstdio&gt;

// H-FILE: WORKER CLASS
class WorkerClass
{
public:
    void DoWork( void ) {;}
};

// H-FILE:  TEMPLATE FOR SINGLEION
template&lt;class TYPE&gt; class Singleton
{
public:
    static void DummyFunc() { M_pObject = new TYPE();   m_Worker.DoWork();  };

private:
    static WorkerClass m_Worker;
    static TYPE* M_pObject;
};

// H-FILE: MY CLASS
class MyClass : public Singleton&lt;MyClass&gt; {
public:
    friend class Singleton&lt;MyClass&gt;;
    WorkerClass  m_CritSec;
};

//////////////
// CPP-FILE //
//////////////

// static members for my singleton class
template&lt;&gt; WorkerClass  Singleton&lt;MyClass&gt;::m_Worker;
template&lt;&gt; MyClass* Singleton&lt;MyClass&gt;::M_pObject = NULL;

int main( int argc, char** argv)
{
    MyClass::DummyFunc();
}
</code></pre>
<pre><code>g++-4.x test.cpp liefert:
test.cpp:(.text._ZN9SingletonI7MyClassE9DummyFuncEv[Singleton&lt;MyClass&gt;::DummyFunc()]+0x1a): undefined reference to `Singleton&lt;MyClass&gt;::m_Worker
</code></pre>
<pre><code>g++-3.3 test.cpp funktioniert, wenn der Code so geändert wurde (das Schlüsselwort template wurde entfernt):

[b]/*** template&lt;&gt; ***/[/b] WorkerClass  Singleton&lt;MyClass&gt;::m_Worker;
</code></pre>
<p>Ich bin wirklich für jede Hilfe dankbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1874083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1874083</guid><dc:creator><![CDATA[Mauze]]></dc:creator><pubDate>Fri, 26 Mar 2010 10:15:17 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: undefined reference (g++-3.3 vs. g++-4.1) [gelöst] on Fri, 26 Mar 2010 11:13:32 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt;&gt; WorkerClass  Singleton&lt;MyClass&gt;::m_Worker;
</code></pre>
<p>Das hier ist leider keine Definition sondern eine sogenannte <em>nondefining declaration</em>. Die ist für normale statische Klassenmember nicht erlaubt, bei voll spezialisierten statischen Membern von Klassentemplates aber schon. Das hat dummerweise zur Folge, dass statische Member von Klassentemplates, die nur einen default-Ctor haben, nicht vollständig spezialisiert werden können, wie du es hier machst.<br />
Andererseits kann man ja immer die allgemeine default-initialisierte Definition mit dem Template Header mitliefern und bei Bedarf die Spezialisierung da anbringen, wo die default-Initialisierung nicht adäquat ist.</p>
<p>Lösung daher:</p>
<pre><code class="language-cpp">// H-FILE:  TEMPLATE FOR SINGLEION
template&lt;class TYPE&gt; class Singleton
{
public:
    static void DummyFunc() { M_pObject = new TYPE();   m_Worker.DoWork();  };

private:
    static WorkerClass m_Worker;
    static TYPE* M_pObject;
};

template &lt;class TYPE&gt; WorkerClass Singleton&lt;TYPE&gt;::m_Worker;
template &lt;class TYPE&gt; Type* Singleton&lt;TYPE&gt;::M_pObject = 0;
</code></pre>
<p>PS: dir ist klar dass du in DummyFunc() so jedesmal ein Speicherleck erzeugst? Die TYPEs werden nie zerstört...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1874091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1874091</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 26 Mar 2010 11:13:32 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: undefined reference (g++-3.3 vs. g++-4.1) [gelöst] on Fri, 26 Mar 2010 10:53:02 GMT]]></title><description><![CDATA[<p>pumuckl, fehlen da nicht noch die Rückgabetypen?</p>
<pre><code class="language-cpp">template &lt;class TYPE&gt; WorkerClass Singleton&lt;TYPE&gt;::m_Worker;
template &lt;class TYPE&gt; Type* Singleton&lt;TYPE&gt;::M_pObject = 0;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1874095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1874095</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Fri, 26 Mar 2010 10:53:02 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: undefined reference (g++-3.3 vs. g++-4.1) [gelöst] on Fri, 26 Mar 2010 11:14:06 GMT]]></title><description><![CDATA[<p>Ja, danke für den Hinweis, habs reineditiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1874112</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1874112</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 26 Mar 2010 11:14:06 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: undefined reference (g++-3.3 vs. g++-4.1) [gelöst] on Fri, 26 Mar 2010 11:20:39 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt;&gt; WorkerClass Singleton&lt;MyClass&gt;::m_Worker = WorkerClass();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1874115</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1874115</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 26 Mar 2010 11:20:39 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: undefined reference (g++-3.3 vs. g++-4.1) [gelöst] on Fri, 26 Mar 2010 11:41:48 GMT]]></title><description><![CDATA[<p>SUPER - DANKE</p>
<p>So funktioniert es jetzt:</p>
<pre><code class="language-cpp">template &lt;class TYPE&gt; WorkerClass Singleton&lt;TYPE&gt;::m_Worker;
template&lt;&gt; MyClass* Singleton&lt;MyClass&gt;::M_pObject = NULL;
</code></pre>
<p>Mein Problem war wohl, das ich nur alle paar Jahre Templates benutze.<br />
Und wenn ich welche benutze, dann schaue ich immer nach wie ich es früher gemacht habe.<br />
Gleichzeitig mit C++0x werde ich mir auch noch mal Templates anschauen müssen.</p>
<p>In der zweiten Zeile verhält es sich wohl so wie bei integrierten Datentypen (e.g. int usw.), da ist immer noch meine alte Schreibweise OK.</p>
<p>Nochmals wirklich vielen Dank<br />
Mauze</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1874124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1874124</guid><dc:creator><![CDATA[Mauze]]></dc:creator><pubDate>Fri, 26 Mar 2010 11:41:48 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: undefined reference (g++-3.3 vs. g++-4.1) [gelöst] on Fri, 26 Mar 2010 11:45:51 GMT]]></title><description><![CDATA[<p>SUPER - DANKE</p>
<p>So funktioniert es jetzt:</p>
<pre><code class="language-cpp">template &lt;class TYPE&gt; WorkerClass Singleton&lt;TYPE&gt;::m_Worker;
template&lt;&gt; MyClass* Singleton&lt;MyClass&gt;::M_pObject = NULL;
</code></pre>
<p>Mein Problem war wohl, das ich nur alle paar Jahre Templates benutze.<br />
Und wenn ich welche benutze, dann schaue ich immer nach wie ich es früher gemacht habe.<br />
Gleichzeitig mit C++0x werde ich mir auch noch mal Templates anschauen müssen.</p>
<p>In der zweiten Zeile verhält es sich wohl so wie bei integrierten Datentypen (e.g. int usw.), da ist immer noch meine alte Schreibweise OK.</p>
<p>Nochmals wirklich vielen Dank<br />
Mauze</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1874127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1874127</guid><dc:creator><![CDATA[Mauze]]></dc:creator><pubDate>Fri, 26 Mar 2010 11:45:51 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: undefined reference (g++-3.3 vs. g++-4.1) [gelöst] on Fri, 26 Mar 2010 12:14:50 GMT]]></title><description><![CDATA[<p>Mauze schrieb:</p>
<blockquote>
<p>In der zweiten Zeile verhält es sich wohl so wie bei integrierten Datentypen (e.g. int usw.), da ist immer noch meine alte Schreibweise OK.</p>
</blockquote>
<p>Jein. Das zweite funktioniert weil der Pointer nicht default-initialisiert wird.</p>
<p>Die beiden Definitionen gehören außerdem in zwei verschiedene Code-Teile und haben unterschiedliche Auswirkungen:<br />
Das Template mit der Definition von m_Worker gehört in den Header mit dem Klassentemplate und sorgt dafür, das jede Instantiierung des Templates automatisch die entsprechende Definition des Members hat.<br />
Die Spezialisierung der Definition von m_pObject gehört dagegen in den Teil, wo die entsprechende Spezialisierung von Sigleton benutzt wird (also in die .cpp), weil sie nur für die eine Instantiierung gilt. Außerdem muss die gleiche Definition für jede weitere Instantiierung von Singleton wiederholt werden.<br />
Ich würde aus deinem Code heraus da keinen Grund für sehen und lieber auch gleich die Definition als template für alle Instantiierungen von Singleton mit in dessen Header packen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1874142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1874142</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 26 Mar 2010 12:14:50 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: undefined reference (g++-3.3 vs. g++-4.1) [gelöst] on Fri, 26 Mar 2010 12:52:10 GMT]]></title><description><![CDATA[<p>Das ist jetzt der komplette fertige Code.</p>
<p>Zu beachten ist, das die entsprechenden Codeanteile in Wirklichkeit auch in den entsprechenden Dateien aufgeteilt werden.<br />
Warum sage ich das, weil ich bei der Übernahme des Codes in mein wirkliches Projekt immer noch nicht linken konnte (weil aufgeteilt auf LIB, SO und EXE).</p>
<p>Das <strong>Jein von Pumuckl</strong> mit der entsprechenden Erklärung hat mich dann in die Lage versetzt, mein Projekt endlich mit g++-4.3 linken zu können.</p>
<p>DANKE - DANKE - DANKE</p>
<pre><code class="language-cpp">#include &lt;cstdio&gt;

// H-FILE: WORKER CLASS
class WorkerClass
{
public:
    void DoWork( void ) {;}
};

// H-FILE:  TEMPLATE FOR SINGLEION
template&lt;class TYPE&gt; class Singleton
{
public:
    static void DummyFunc() { M_pObject = new TYPE();   m_Worker.DoWork(); delete M_pObject; };

private:
    static WorkerClass m_Worker;
    static TYPE* M_pObject;
};
template &lt;class TYPE&gt; WorkerClass Singleton&lt;TYPE&gt;::m_Worker;

// H-FILE: MY CLASS
class MyClass : public Singleton&lt;MyClass&gt; {
public:
    friend class Singleton&lt;MyClass&gt;;
    WorkerClass  m_CritSec;
};

//////////////
// CPP-FILE //
//////////////

template&lt;&gt; MyClass* Singleton&lt;MyClass&gt;::M_pObject = NULL;

int main( int argc, char** argv)
{
    MyClass::DummyFunc();
}
</code></pre>
<p>Ich denke jetzt aber wirklich gelöst - ODER?</p>
<p>Mauze</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1874158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1874158</guid><dc:creator><![CDATA[Mauze]]></dc:creator><pubDate>Fri, 26 Mar 2010 12:52:10 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: undefined reference (g++-3.3 vs. g++-4.1) [gelöst] on Fri, 26 Mar 2010 15:44:09 GMT]]></title><description><![CDATA[<p>Mauze schrieb:</p>
<blockquote>
<p>Ich denke jetzt aber wirklich gelöst - ODER?</p>
</blockquote>
<p>Immernoch jein. Wie oben schon gesagt musst du so immernoch für jede neue Intantiierung des Templates eine neue vollkommen spezialisierte Definition von M_pObject dazu packen, um dafür nicht undefined references zu kriegen.</p>
<p>Also nochmal die Frage: Was hindert dich daran, auch M_pObject im Header so zu definieren wie vorgeschlagen, nämlich per Template? Die Initialisierung mit NULL ist für alle Instantiierungen so doch völlig in Ordnung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1874250</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1874250</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 26 Mar 2010 15:44:09 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: undefined reference (g++-3.3 vs. g++-4.1) [gelöst] on Sun, 28 Mar 2010 06:04:42 GMT]]></title><description><![CDATA[<p>Das Forum war irgendwie nicht mehr erreichbar, darum jetzt erst eine Antwort.</p>
<p>Wenn ich das so wie von Dir vorgeschlagen versuchte, dann bekam ich immer folgenden Compiler Fehler:</p>
<pre><code>error: expected constructor, destructor, or type conversion before ‘*’ token
</code></pre>
<p>Dann ist mir endlich der Tippfehler aufgefallen:</p>
<pre><code>[b]FALSCH:[/b]  template &lt;class TYPE&gt; [b]Type*[/b] Singleton&lt;TYPE&gt;::M_pObject = 0;
[b]RICHTIG:[/b] template &lt;class TYPE&gt; [b]TYPE*[/b] Singleton&lt;TYPE&gt;::M_pObject = 0;
</code></pre>
<p>Das ist jetzt der Code ohne JEIN:</p>
<pre><code class="language-cpp">#include &lt;cstdio&gt;

// H-FILE: WORKER CLASS
class WorkerClass
{
public:
    void DoWork( void ) {;}
};

// H-FILE:  TEMPLATE FOR SINGLEION
template&lt;class TYPE&gt; class Singleton
{
public:
    static void DummyFunc() { M_pObject = new TYPE();   m_Worker.DoWork(); delete M_pObject; };

private:
    static WorkerClass m_Worker;
    static TYPE* M_pObject;
};
template &lt;class TYPE&gt; WorkerClass Singleton&lt;TYPE&gt;::m_Worker;
template &lt;class TYPE&gt; TYPE* Singleton&lt;TYPE&gt;::M_pObject = 0;

// H-FILE: MY CLASS
class MyClass : public Singleton&lt;MyClass&gt; {
public:
    friend class Singleton&lt;MyClass&gt;;
};

//////////////
// CPP-FILE //
//////////////

int main( int argc, char** argv)
{
    MyClass::DummyFunc();
}
</code></pre>
<p>Mauze</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1874372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1874372</guid><dc:creator><![CDATA[Mauze]]></dc:creator><pubDate>Sun, 28 Mar 2010 06:04:42 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: undefined reference (g++-3.3 vs. g++-4.1) [gelöst] on Sun, 28 Mar 2010 11:54:23 GMT]]></title><description><![CDATA[<p>Mauze schrieb:</p>
<blockquote>
<p>Das ist jetzt der Code ohne JEIN:</p>
</blockquote>
<p>Genau <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1874477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1874477</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sun, 28 Mar 2010 11:54:23 GMT</pubDate></item></channel></rss>