<?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 Member und Template]]></title><description><![CDATA[<p>Hallo, habe folgendes Problem<br />
ich muss für eine interne scriptengine eine Liste mit allen Methoden namen bestimmter Klassen mitführen. Dazu wollte ich ursprünglich eine static list/vector etc. benutzen, hab dann aber festgestellt, dass sich die vererbten Klassen mit der Elternklasse eine Variable teilen. Also wollte ich daraus ein Template machen, in etwa so (rudimentär, die Variable heißt hier test und ist ein int):</p>
<pre><code class="language-cpp">//Base.h
template&lt;class T&gt;
class Base
{
public:
	Base(void);
	~Base(void);

	static int test;
};
</code></pre>
<pre><code class="language-cpp">//Base.cpp
#include &quot;Base.h&quot;

template&lt;class T&gt;
Base&lt;T&gt;::Base(void)
{
}

template&lt;class T&gt;
Base&lt;T&gt;::~Base(void)
{
}

template&lt;class T&gt;
int Base&lt;T&gt;::test = 0;
</code></pre>
<pre><code class="language-cpp">//derived.h
#include &quot;Base.h&quot;

class derived : public Base&lt;derived&gt;
{
public:
	derived(void);
	~derived(void);
};
</code></pre>
<pre><code class="language-cpp">//derived.cpp
#include &quot;derived.h&quot;

derived::derived(void)
{
}

derived::~derived(void)
{
}
</code></pre>
<p>Nun bekomme ich Linkerfehler:</p>
<pre><code>Fehler	1	error LNK2001: Nicht aufgelöstes externes Symbol &quot;&quot;public: static int Base&lt;class derived&gt;::test&quot; (?test@?$Base@Vderived@@@@2HA)&quot;.	Statics_vererben2.obj
</code></pre>
<p>Nach lesen der FAQ hier auf der Seite hab ich versucht an die Base.cpp noch ein</p>
<pre><code class="language-cpp">#include &quot;Base.cpp&quot;
</code></pre>
<p>anzuhängen, dann gehts!<br />
Aber:<br />
Wenn ich jetzt auf Projekt,bereinigen gehe, kommen beim nächsten Kompilieren die fehler</p>
<pre><code>Fehler	1	error C2995: &quot;Base&lt;T&gt;::Base(void)&quot;: Funktionsvorlage wurde bereits definiert.	c:\dokumente und einstellungen\administrator\eigene dateien\visual studio 2005\projects\statics_vererben2\statics_vererben2\base.cpp	6	

Fehler	2	error C2995: &quot;Base&lt;T&gt;::~Base(void)&quot;: Funktionsvorlage wurde bereits definiert.	c:\dokumente und einstellungen\administrator\eigene dateien\visual studio 2005\projects\statics_vererben2\statics_vererben2\base.cpp	11	

Fehler	3	error C2086: 'int Base&lt;T&gt;::test': Neudefinition	c:\dokumente und einstellungen\administrator\eigene dateien\visual studio 2005\projects\statics_vererben2\statics_vererben2\base.cpp	14
</code></pre>
<p>Ich hab leider keine ahnung wie ich das unterbinden kann <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Das ganze sollte natürlich standardkonform sein (bzw muss unter vs2005 und gcc kompilieren)</p>
<p>Mit freundlichen Grüßen<br />
Mene</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/180447/static-member-und-template</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 20:33:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/180447.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 02 May 2007 20:43:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to static Member und Template on Wed, 02 May 2007 20:43:21 GMT]]></title><description><![CDATA[<p>Hallo, habe folgendes Problem<br />
ich muss für eine interne scriptengine eine Liste mit allen Methoden namen bestimmter Klassen mitführen. Dazu wollte ich ursprünglich eine static list/vector etc. benutzen, hab dann aber festgestellt, dass sich die vererbten Klassen mit der Elternklasse eine Variable teilen. Also wollte ich daraus ein Template machen, in etwa so (rudimentär, die Variable heißt hier test und ist ein int):</p>
<pre><code class="language-cpp">//Base.h
template&lt;class T&gt;
class Base
{
public:
	Base(void);
	~Base(void);

	static int test;
};
</code></pre>
<pre><code class="language-cpp">//Base.cpp
#include &quot;Base.h&quot;

template&lt;class T&gt;
Base&lt;T&gt;::Base(void)
{
}

template&lt;class T&gt;
Base&lt;T&gt;::~Base(void)
{
}

template&lt;class T&gt;
int Base&lt;T&gt;::test = 0;
</code></pre>
<pre><code class="language-cpp">//derived.h
#include &quot;Base.h&quot;

class derived : public Base&lt;derived&gt;
{
public:
	derived(void);
	~derived(void);
};
</code></pre>
<pre><code class="language-cpp">//derived.cpp
#include &quot;derived.h&quot;

derived::derived(void)
{
}

derived::~derived(void)
{
}
</code></pre>
<p>Nun bekomme ich Linkerfehler:</p>
<pre><code>Fehler	1	error LNK2001: Nicht aufgelöstes externes Symbol &quot;&quot;public: static int Base&lt;class derived&gt;::test&quot; (?test@?$Base@Vderived@@@@2HA)&quot;.	Statics_vererben2.obj
</code></pre>
<p>Nach lesen der FAQ hier auf der Seite hab ich versucht an die Base.cpp noch ein</p>
<pre><code class="language-cpp">#include &quot;Base.cpp&quot;
</code></pre>
<p>anzuhängen, dann gehts!<br />
Aber:<br />
Wenn ich jetzt auf Projekt,bereinigen gehe, kommen beim nächsten Kompilieren die fehler</p>
<pre><code>Fehler	1	error C2995: &quot;Base&lt;T&gt;::Base(void)&quot;: Funktionsvorlage wurde bereits definiert.	c:\dokumente und einstellungen\administrator\eigene dateien\visual studio 2005\projects\statics_vererben2\statics_vererben2\base.cpp	6	

Fehler	2	error C2995: &quot;Base&lt;T&gt;::~Base(void)&quot;: Funktionsvorlage wurde bereits definiert.	c:\dokumente und einstellungen\administrator\eigene dateien\visual studio 2005\projects\statics_vererben2\statics_vererben2\base.cpp	11	

Fehler	3	error C2086: 'int Base&lt;T&gt;::test': Neudefinition	c:\dokumente und einstellungen\administrator\eigene dateien\visual studio 2005\projects\statics_vererben2\statics_vererben2\base.cpp	14
</code></pre>
<p>Ich hab leider keine ahnung wie ich das unterbinden kann <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Das ganze sollte natürlich standardkonform sein (bzw muss unter vs2005 und gcc kompilieren)</p>
<p>Mit freundlichen Grüßen<br />
Mene</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1277836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1277836</guid><dc:creator><![CDATA[Mene]]></dc:creator><pubDate>Wed, 02 May 2007 20:43:21 GMT</pubDate></item><item><title><![CDATA[Reply to static Member und Template on Wed, 02 May 2007 21:06:51 GMT]]></title><description><![CDATA[<p>ne sowas kannst de nicht machen(cpp-files includieren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> )...</p>
<pre><code class="language-cpp">#if !defined(BASE_H__INCLUDED)
#define BASE_H__INCLUDED

template&lt;class T&gt;

class Base
{
public:
    Base() {}
    ~Base() {}

private:
    static int m_test;
};

template&lt;class T&gt;
Base&lt;T&gt;::m_test = 0;

#endif
</code></pre>
<p>Also komplett in den Header .. dann sollte das gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1277847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1277847</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Wed, 02 May 2007 21:06:51 GMT</pubDate></item><item><title><![CDATA[Reply to static Member und Template on Wed, 02 May 2007 21:19:07 GMT]]></title><description><![CDATA[<p>Hab jetzt die standardprozedur aus den headern auf die cpp angewandt, also:</p>
<pre><code class="language-cpp">#include &quot;Base.h&quot;

#if !defined(BASE_CPP__INCLUDED)
#define BASE_CPP__INCLUDED

template&lt;class T&gt;
Base&lt;T&gt;::Base(void)
{
}

template&lt;class T&gt;
Base&lt;T&gt;::~Base(void)
{
}

template&lt;class T&gt;
int Base&lt;T&gt;::test = 0;

#endif
</code></pre>
<p>find ich persönlich schöner als alles in eine datei und klappt jetz ohne probleme <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1277851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1277851</guid><dc:creator><![CDATA[Mene]]></dc:creator><pubDate>Wed, 02 May 2007 21:19:07 GMT</pubDate></item><item><title><![CDATA[Reply to static Member und Template on Thu, 03 May 2007 12:48:39 GMT]]></title><description><![CDATA[<p>Du scheinst aber keine Ahnung zu haben was die #if's und #endif's machen ... bzw wie man sie in diesem speziellen Fall nennt.<br />
Auch von wegen Templates hast du scheinbar noch nen paar Lücken ... lies dir mal anständige Bücher dazu durch. SRy</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1278102</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1278102</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Thu, 03 May 2007 12:48:39 GMT</pubDate></item></channel></rss>