<?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[Frage zur compilierung von Templates]]></title><description><![CDATA[<p>Ich bin neu beim Thema Templates und verstehe noch nicht ganz wie ich folgendes schaffe:</p>
<p>Ich habe eine Datei in der ich auf eine generalisierte Klasse und deren Methoden zugreife. Der Datei ist die Deklaration der template-Klasse bekannt, sie bindet jedoch NICHT direkt ihre Definition ein.<br />
Die Definition der Template-Klasse wird getrennt compiliert.<br />
Soweit so gut, nun das Problem:<br />
Wie erzeuge ich die spezialisierte Form der Templates-Klasse für meinen Fall?<br />
Ich kann ja nicht einfach die beiden Libraries zusammen linken, da mir die Spezialisierung fehlt, und der Linker meckert das er eine undefinierte Referenz gefunden hat.<br />
Ich habe gedacht das dafür das Schlüsselwort export ist, aber g++ sagt das es nicht implementiert ist.</p>
<p>Code Beispiel:</p>
<pre><code class="language-cpp">//blub.hpp
template&lt;class T&gt;
class Blub {
    public:
	T t;
	T get();
};
</code></pre>
<pre><code class="language-cpp">//blub.cpp
#include &quot;blub.hpp&quot;

template&lt;class T&gt;
T Blub&lt;T&gt;::get() { return t; }
</code></pre>
<pre><code class="language-cpp">//test.cpp
#include &lt;iostream&gt;
#include &quot;blub.hpp&quot;

int main() {
    Blub&lt;int&gt; blub;
    std::cout &lt;&lt; blub.get();
    return 0;
}
</code></pre>
<p>Konsole:</p>
<pre><code>$ g++ -c blub.cpp
$ g++ -c test.cpp
$ g++ test.o blub.o
test.o: In function `main':
test.cpp:(.text+0x11): undefined reference to `Blub&lt;int&gt;::get()'
collect2: ld returned 1 exit status
$
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/257731/frage-zur-compilierung-von-templates</link><generator>RSS for Node</generator><lastBuildDate>Wed, 09 Sep 2026 23:20:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/257731.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 02 Jan 2010 15:45:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zur compilierung von Templates on Sat, 02 Jan 2010 15:45:27 GMT]]></title><description><![CDATA[<p>Ich bin neu beim Thema Templates und verstehe noch nicht ganz wie ich folgendes schaffe:</p>
<p>Ich habe eine Datei in der ich auf eine generalisierte Klasse und deren Methoden zugreife. Der Datei ist die Deklaration der template-Klasse bekannt, sie bindet jedoch NICHT direkt ihre Definition ein.<br />
Die Definition der Template-Klasse wird getrennt compiliert.<br />
Soweit so gut, nun das Problem:<br />
Wie erzeuge ich die spezialisierte Form der Templates-Klasse für meinen Fall?<br />
Ich kann ja nicht einfach die beiden Libraries zusammen linken, da mir die Spezialisierung fehlt, und der Linker meckert das er eine undefinierte Referenz gefunden hat.<br />
Ich habe gedacht das dafür das Schlüsselwort export ist, aber g++ sagt das es nicht implementiert ist.</p>
<p>Code Beispiel:</p>
<pre><code class="language-cpp">//blub.hpp
template&lt;class T&gt;
class Blub {
    public:
	T t;
	T get();
};
</code></pre>
<pre><code class="language-cpp">//blub.cpp
#include &quot;blub.hpp&quot;

template&lt;class T&gt;
T Blub&lt;T&gt;::get() { return t; }
</code></pre>
<pre><code class="language-cpp">//test.cpp
#include &lt;iostream&gt;
#include &quot;blub.hpp&quot;

int main() {
    Blub&lt;int&gt; blub;
    std::cout &lt;&lt; blub.get();
    return 0;
}
</code></pre>
<p>Konsole:</p>
<pre><code>$ g++ -c blub.cpp
$ g++ -c test.cpp
$ g++ test.o blub.o
test.o: In function `main':
test.cpp:(.text+0x11): undefined reference to `Blub&lt;int&gt;::get()'
collect2: ld returned 1 exit status
$
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1830968</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1830968</guid><dc:creator><![CDATA[LeggaLasagne]]></dc:creator><pubDate>Sat, 02 Jan 2010 15:45:27 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur compilierung von Templates on Sat, 02 Jan 2010 15:47:24 GMT]]></title><description><![CDATA[<p>LeggaLasagne schrieb:</p>
<blockquote>
<p>Ich habe eine Datei in der ich auf eine generalisierte Klasse und deren Methoden zugreife. Der Datei ist die Deklaration der template-Klasse bekannt, sie bindet jedoch NICHT direkt ihre Definition ein.<br />
Die Definition der Template-Klasse wird getrennt compiliert.<br />
Soweit so gut, nun das Problem</p>
</blockquote>
<p>Nein, soweit so schlecht. Da das Schlüsselwort <code>export</code> von kaum einem Compiler unterstützt wird, musst du Templates vollständig in Headerdateien definieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1830971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1830971</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 02 Jan 2010 15:47:24 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur compilierung von Templates on Sat, 02 Jan 2010 15:48:53 GMT]]></title><description><![CDATA[<p>Guckst du FAQ:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-246875.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-246875.html</a><br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39467.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-39467.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1830974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1830974</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sat, 02 Jan 2010 15:48:53 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur compilierung von Templates on Sat, 02 Jan 2010 16:35:53 GMT]]></title><description><![CDATA[<p>Ah, ich war mir natürlich mal wieder zu fein in die FAQ zu schauen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /><br />
Dadurch verliert man dann natürlich den Vorteil, die Klassen-definition getrennt von ihrer Anwendung zu compilieren, d.h. immer wenn ich was am Template ändere, muss ich auch die Komplette Anwendungs-Datei neu compilieren, oder irre ich mich?</p>
<blockquote>
<p>Hier braucht man im Gegensatz zu icht-Templates keine Angst vor Mehrfachdefinitionen in verschiedenen Headern zu haben, der Linker erkennt Templateklassen und -funktionen und ignoriert die zusätzlichen Definitionen.</p>
</blockquote>
<p>Warum ist der Linker nicht so schlau und bemerkt das auch bei normalen Klassen und Funktionen, anstatt sich über multiple Definitionen zu beschweren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1830997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1830997</guid><dc:creator><![CDATA[LeggaLasagne]]></dc:creator><pubDate>Sat, 02 Jan 2010 16:35:53 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur compilierung von Templates on Sat, 02 Jan 2010 16:43:44 GMT]]></title><description><![CDATA[<p>LeggaLasagne schrieb:</p>
<blockquote>
<p>Dadurch verliert man dann natürlich den Vorteil, die Klassen-definition getrennt von ihrer Anwendung zu compilieren, d.h. immer wenn ich was am Template ändere, muss ich auch die Komplette Anwendungs-Datei neu compilieren, oder irre ich mich?</p>
</blockquote>
<p>Nein, du hast Recht. Das ist in der Tat ein Problem. Man kann sich zwar Header und Implementierung immer noch trennen, indem man die Definitionen in eine .inl-Datei schreibt und diese am Ende des Schnittstellen-Headers inkludiert, aber bei Änderungen der Implementierung muss der abhängige Code neu kompiliert werden.</p>
<p>LeggaLasagne schrieb:</p>
<blockquote>
<p>Warum ist der Linker nicht so schlau und bemerkt das auch bei normalen Klassen und Funktionen, anstatt sich über multiple Definitionen zu beschweren?</p>
</blockquote>
<p>Sofern du die Methoden inline definierst, ist das kein Problem. Aber das empfiehlt sich wegen der genannten Abhängigkeiten nicht – hier hat man im Gegensatz zu Templates ja die Wahl. Ausserdem ist auch die Kompilierzeit höher, wenn die gesamte Implementierung jedes Mal von neuem geparst werden muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1831003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1831003</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 02 Jan 2010 16:43:44 GMT</pubDate></item></channel></rss>