<?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[Problem mit Templateklasse und new]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe da ein kleines Problem mit einer Template-Klasse, die ich erstellt habe. So wie es aussieht kann ich für die Template-Klasse keinen Speicher allozieren. Aber erstmal kurz der Source:</p>
<pre><code class="language-cpp">// Headerdatei templateTest.hpp
#include &lt;iostream&gt;

using namespace std;
class A 
{
	public :
		A()
		{
			cout &lt;&lt; &quot;class A&quot; &lt;&lt; endl;
		}
};

template &lt;class T&gt;
class B : public A
{
	private :
		T t;
	public :
		B();

};

// Sourcedatei templateTest.cpp
#include &quot;templateTest.hpp&quot;

template&lt;class T&gt; B&lt;T&gt;::B()
{
	cout &lt;&lt; &quot;class B&quot; &lt;&lt; endl;
}

// Sourcedatei main.cpp
#include &quot;templateTest.hpp&quot;

int main()
{
	A* a;
	a=new B&lt;int&gt;; //hier tritt scheinbar das Problem auf
	return 0;
}
</code></pre>
<p>mein makefile sieht dann wie folgt aus:</p>
<pre><code>CC = g++
all : main.o templateTest.o
	${CC} -o templateTest main.o templateTest.o

main.o :
	${CC} -c main.cpp

templateTest.o :
	${CC} -c templateTest.cpp

clean :
	@- rm -f *.o templateTest
</code></pre>
<p>Nun beklagt der Linker, dass er die Referenz zu B() nicht auflösen kann.</p>
<pre><code>undefined reference to `B&lt;int&gt;::B()'
</code></pre>
<p>Weiß jemand vielleicht warum g++ das Programm anstandslos kompiliert aber nicht linken kann, obwohl die Objektdateien mit den Referenzen vorhanden sind? Ich bin für jede Hilfe/Idee dankbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/175909/problem-mit-templateklasse-und-new</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 21:54:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/175909.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 15 Mar 2007 11:42:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Templateklasse und new on Thu, 15 Mar 2007 11:46:32 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe da ein kleines Problem mit einer Template-Klasse, die ich erstellt habe. So wie es aussieht kann ich für die Template-Klasse keinen Speicher allozieren. Aber erstmal kurz der Source:</p>
<pre><code class="language-cpp">// Headerdatei templateTest.hpp
#include &lt;iostream&gt;

using namespace std;
class A 
{
	public :
		A()
		{
			cout &lt;&lt; &quot;class A&quot; &lt;&lt; endl;
		}
};

template &lt;class T&gt;
class B : public A
{
	private :
		T t;
	public :
		B();

};

// Sourcedatei templateTest.cpp
#include &quot;templateTest.hpp&quot;

template&lt;class T&gt; B&lt;T&gt;::B()
{
	cout &lt;&lt; &quot;class B&quot; &lt;&lt; endl;
}

// Sourcedatei main.cpp
#include &quot;templateTest.hpp&quot;

int main()
{
	A* a;
	a=new B&lt;int&gt;; //hier tritt scheinbar das Problem auf
	return 0;
}
</code></pre>
<p>mein makefile sieht dann wie folgt aus:</p>
<pre><code>CC = g++
all : main.o templateTest.o
	${CC} -o templateTest main.o templateTest.o

main.o :
	${CC} -c main.cpp

templateTest.o :
	${CC} -c templateTest.cpp

clean :
	@- rm -f *.o templateTest
</code></pre>
<p>Nun beklagt der Linker, dass er die Referenz zu B() nicht auflösen kann.</p>
<pre><code>undefined reference to `B&lt;int&gt;::B()'
</code></pre>
<p>Weiß jemand vielleicht warum g++ das Programm anstandslos kompiliert aber nicht linken kann, obwohl die Objektdateien mit den Referenzen vorhanden sind? Ich bin für jede Hilfe/Idee dankbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1245986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1245986</guid><dc:creator><![CDATA[tyr377]]></dc:creator><pubDate>Thu, 15 Mar 2007 11:46:32 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Templateklasse und new on Thu, 15 Mar 2007 11:46:53 GMT]]></title><description><![CDATA[<p>Template-Funktionen müssen im Header definiert werden, sonst kann der Compiler sie nicht instanziieren (dafür benötigt er sowohl die Definition als auch die Informationen, welchen Typ er einsetzen soll - die hast du aber clevererweise auf zwei CPPs verteilt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1245989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1245989</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 15 Mar 2007 11:46:53 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Templateklasse und new on Thu, 15 Mar 2007 11:55:37 GMT]]></title><description><![CDATA[<p>Richtig, dass habe ich auch schon festgestellt. Kannst du mir denn sagen warum das so sein muss? Ich habe irgendwo mal gelesen, dass es so auch gehen soll. Dort benutzen sie aber keinen Zeiger. Wobei ich mir nicht vorstellen kann, warum es ausgerechnet am Zeiger scheitern soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1245994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1245994</guid><dc:creator><![CDATA[tyr377]]></dc:creator><pubDate>Thu, 15 Mar 2007 11:55:37 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Templateklasse und new on Thu, 15 Mar 2007 12:00:49 GMT]]></title><description><![CDATA[<p>Sieh doch auch mal in die FAQ<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39467.html" rel="nofollow">Template in Header- und Source-Datei aufteilen</a><br />
Da gibt es auch weiterführende Links. Das hat hier übrigens nichts mit den Zeigern zu tun. Es geht prinzipiell nicht (mit den im Link erwähnten Einschränkungen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1245999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1245999</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 15 Mar 2007 12:00:49 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Templateklasse und new on Thu, 15 Mar 2007 12:07:17 GMT]]></title><description><![CDATA[<p>Das hat etwas mit der Template-Instanziierung zu tun. Template-Funktionen und -Klassen können erst dann in &quot;echte&quot; Klassen umgewandelt werden, wenn sie instanziiert werden (sprich: wenn du die Template-Parameter festlegst), deshalb muß zu dem Zeitpunkt die Definition bekannt sein.</p>
<p>In deinem Beispiel werden die beiden CPP-Dateien unabhängig voneinander übersetzt und später vom Linker zusammengeführt. Und da kommt das Problem ins Spiel:</p>
<ul>
<li>templateTest.cpp:<br />
Der Compiler sieht die Definition des B-Ctors, hat aber keine Instanziierung vorliegen. Also kann er nur die syntaktische Korrektheit dieser Funktion überprüfen, aber keinen Maschinencode erzeugen (schließlich weiß er nicht, ob du später ein B&lt;int&gt;, B&lt;string&gt; oder B&lt;own_type&gt; verwenden willst).<br />
~<strong>Im ANSI-Standard gibt es das Schlüsselwort 'export', aber kaum ein Compiler setzt es bislang um.</strong>~</li>
<li>main.cpp:<br />
Der Compiler sieht die Instanziierung deiner Template-Klasse, aber er hat nur die Deklaration ihrer Methoden zur Verfügung, also kann er wieder keinen Maschinencode erzeugen.</li>
</ul>
<p>Die Lösung dieses Problems ist (wie oben gesagt) einfach - der B-Ctor gehört auch in den Header.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1246007</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1246007</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 15 Mar 2007 12:07:17 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Templateklasse und new on Thu, 15 Mar 2007 12:12:04 GMT]]></title><description><![CDATA[<p>Somit sind alle meine Fragen beantwortet. Vielen Dank. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1246009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1246009</guid><dc:creator><![CDATA[tyr377]]></dc:creator><pubDate>Thu, 15 Mar 2007 12:12:04 GMT</pubDate></item></channel></rss>