<?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[Template-Klasse: objektdatei + linker -&amp;gt; Fehler! ohne template gehts]]></title><description><![CDATA[<p>Halli hallo miteinander,</p>
<p>Bis jetzt bin ich mit dem Programmieren ganz gut vorangekommen. &quot;einstieg in C++&quot; von Arnold Willemer und &quot;Die Programmiersprache C++&quot; von Bjarne Stroustrup als Referenzbuch geholt, komme eigentlich ganz gut voran und kann die Bücher jedem empfehlen.</p>
<p>Aber jetzt bin ich auf ein Problem mit Templates gestoßen. Ich glaube auch nicht so recht, dass es am Compiler liegt (Dev-C++) und poste deshalb hier ins Forum.</p>
<p>Ich verwende ja die Objektdatei folgendermaßen:<br />
In <em>klasse.hpp</em> definiere ich die Klasse und in <em>klasse.cpp</em>, wird die header-Datei includiert und die Funktionen deklariert. Dann kompiliere ich das Projekt und es kommt eine obj-Datei dabei raus (oder o-Datei). Diese o-/obj-Datei mache ich dann dem Linker im Projekt, dass diese Klasse verwenden soll, bekannt und binde den Header <em>klasse.hpp</em> ein.</p>
<p>Soweit zur Theorie...</p>
<p><strong>Beispiel ohne Template, das auch ohne Probleme funktioniert:</strong><br />
(Falls ich mich nicht vertippt habe <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">//klasse.hpp

#ifndef _KLASSE_HPP_
#define _KLASSE_HPP_

class klasse
{
public:
   void test_func();
};

#endif // _KLASSE_HPP_
</code></pre>
<pre><code class="language-cpp">//klasse.cpp

#include &lt;iostream&gt;
using namespace std;
#include &quot;klasse.hpp&quot;

void klasse::test_func()
{
   cout &lt;&lt; &quot;Ich bin eine Testfunktion!&quot; &lt;&lt; endl;
}
</code></pre>
<p>Das Compiliere ich jetzt, kriege dieo-/obj-Datei, mache sie Dem Linker im folgenden Projekt bekannt und binde <em>klasse.hpp</em> ein:</p>
<pre><code class="language-cpp">// main.cpp

#include &lt;iostream&gt;
using namespace std;
#include &quot;klasse.hpp&quot;

int main()
{
   klasse meine_klasse;
   meine_klasse.test_func();
}
</code></pre>
<p><strong>Beispiel mit Template-Klasse, bei der der Linker nicht will:</strong><br />
(Wahrscheinlich übersehe ich da einfach was...)</p>
<pre><code class="language-cpp">//klasse.hpp

#ifndef _KLASSE_HPP_
#define _KLASSE_HPP_

template &lt;class T1, class T2&gt; class klasse
{
   void test_func();
};

#endif // _KLASSE_HPP_
</code></pre>
<pre><code class="language-cpp">//klasse.cpp

#include &lt;iostream&gt;
using namespace std;
#include &quot;klasse.hpp&quot;

template &lt;class T1, class T2&gt; void klasse&lt;T1,T2&gt;::test_func()
{
   cout &lt;&lt; &quot;Ich bin eine Testfunktion!&quot; &lt;&lt; endl;
}
</code></pre>
<p>Müsste sich auch wieder ganz normal zu einer o-/obj-Datei kompilieren lassen, wenn ich mich nicht vertippt habe...<br />
Dann mache ich diese wieder dem Linker im folgenden Projekt bekannt und inkludiere <em>klasse.hpp</em>.</p>
<pre><code class="language-cpp">// main.cpp

#include &lt;iostream&gt;
using namespace std;
#include &quot;klasse.hpp&quot;

int main()
{
   klasse meine_klasse&lt;int,int&gt;;
   meine_klasse.test_func();
}
</code></pre>
<p>Was ist daran falsch?<br />
Der Compiler wirft mir das an den Kopf:</p>
<pre><code>[Linker error] undefined reference to `klasse&lt;int, int&gt;::test_func()'
</code></pre>
<p>(Hab die Meldung ein bisschen angepasst, da ich es mit namespace probiert hatte und de klassenname anders war, tut aber nichts zur Sache, denn ich habe das schlichtere Beispiel auch mal probiert und so sollte die Meldung aussehen)</p>
<p>Wenn ich den Vorgang mit der Objektdatei weglasse und alles in eine Datei schreibe, dann geht es doch auch, warum aber nicht mit der Objektdatei?</p>
<p>Ich habe geknobelt, komm aber nicht drauf.<br />
Ich habe es mir zwar abgewöhnt andere mit &quot;Kleinigkeiten&quot; und meinen Problemen zu nerven, aber ich komm einfach nicht mehr voran, möchte das jetzt gelöst haben und setzte nun auf euch...</p>
<p>Bin jedem sehr dankbar für eine hilfreiche Antwort! Danke jetzt schon einmal für das Durchlesen^^<br />
MfG Knickedi</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/167618/template-klasse-objektdatei-linker-gt-fehler-ohne-template-gehts</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 01:31:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/167618.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 13 Dec 2006 06:15:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template-Klasse: objektdatei + linker -&amp;gt; Fehler! ohne template gehts on Wed, 13 Dec 2006 06:15:59 GMT]]></title><description><![CDATA[<p>Halli hallo miteinander,</p>
<p>Bis jetzt bin ich mit dem Programmieren ganz gut vorangekommen. &quot;einstieg in C++&quot; von Arnold Willemer und &quot;Die Programmiersprache C++&quot; von Bjarne Stroustrup als Referenzbuch geholt, komme eigentlich ganz gut voran und kann die Bücher jedem empfehlen.</p>
<p>Aber jetzt bin ich auf ein Problem mit Templates gestoßen. Ich glaube auch nicht so recht, dass es am Compiler liegt (Dev-C++) und poste deshalb hier ins Forum.</p>
<p>Ich verwende ja die Objektdatei folgendermaßen:<br />
In <em>klasse.hpp</em> definiere ich die Klasse und in <em>klasse.cpp</em>, wird die header-Datei includiert und die Funktionen deklariert. Dann kompiliere ich das Projekt und es kommt eine obj-Datei dabei raus (oder o-Datei). Diese o-/obj-Datei mache ich dann dem Linker im Projekt, dass diese Klasse verwenden soll, bekannt und binde den Header <em>klasse.hpp</em> ein.</p>
<p>Soweit zur Theorie...</p>
<p><strong>Beispiel ohne Template, das auch ohne Probleme funktioniert:</strong><br />
(Falls ich mich nicht vertippt habe <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">//klasse.hpp

#ifndef _KLASSE_HPP_
#define _KLASSE_HPP_

class klasse
{
public:
   void test_func();
};

#endif // _KLASSE_HPP_
</code></pre>
<pre><code class="language-cpp">//klasse.cpp

#include &lt;iostream&gt;
using namespace std;
#include &quot;klasse.hpp&quot;

void klasse::test_func()
{
   cout &lt;&lt; &quot;Ich bin eine Testfunktion!&quot; &lt;&lt; endl;
}
</code></pre>
<p>Das Compiliere ich jetzt, kriege dieo-/obj-Datei, mache sie Dem Linker im folgenden Projekt bekannt und binde <em>klasse.hpp</em> ein:</p>
<pre><code class="language-cpp">// main.cpp

#include &lt;iostream&gt;
using namespace std;
#include &quot;klasse.hpp&quot;

int main()
{
   klasse meine_klasse;
   meine_klasse.test_func();
}
</code></pre>
<p><strong>Beispiel mit Template-Klasse, bei der der Linker nicht will:</strong><br />
(Wahrscheinlich übersehe ich da einfach was...)</p>
<pre><code class="language-cpp">//klasse.hpp

#ifndef _KLASSE_HPP_
#define _KLASSE_HPP_

template &lt;class T1, class T2&gt; class klasse
{
   void test_func();
};

#endif // _KLASSE_HPP_
</code></pre>
<pre><code class="language-cpp">//klasse.cpp

#include &lt;iostream&gt;
using namespace std;
#include &quot;klasse.hpp&quot;

template &lt;class T1, class T2&gt; void klasse&lt;T1,T2&gt;::test_func()
{
   cout &lt;&lt; &quot;Ich bin eine Testfunktion!&quot; &lt;&lt; endl;
}
</code></pre>
<p>Müsste sich auch wieder ganz normal zu einer o-/obj-Datei kompilieren lassen, wenn ich mich nicht vertippt habe...<br />
Dann mache ich diese wieder dem Linker im folgenden Projekt bekannt und inkludiere <em>klasse.hpp</em>.</p>
<pre><code class="language-cpp">// main.cpp

#include &lt;iostream&gt;
using namespace std;
#include &quot;klasse.hpp&quot;

int main()
{
   klasse meine_klasse&lt;int,int&gt;;
   meine_klasse.test_func();
}
</code></pre>
<p>Was ist daran falsch?<br />
Der Compiler wirft mir das an den Kopf:</p>
<pre><code>[Linker error] undefined reference to `klasse&lt;int, int&gt;::test_func()'
</code></pre>
<p>(Hab die Meldung ein bisschen angepasst, da ich es mit namespace probiert hatte und de klassenname anders war, tut aber nichts zur Sache, denn ich habe das schlichtere Beispiel auch mal probiert und so sollte die Meldung aussehen)</p>
<p>Wenn ich den Vorgang mit der Objektdatei weglasse und alles in eine Datei schreibe, dann geht es doch auch, warum aber nicht mit der Objektdatei?</p>
<p>Ich habe geknobelt, komm aber nicht drauf.<br />
Ich habe es mir zwar abgewöhnt andere mit &quot;Kleinigkeiten&quot; und meinen Problemen zu nerven, aber ich komm einfach nicht mehr voran, möchte das jetzt gelöst haben und setzte nun auf euch...</p>
<p>Bin jedem sehr dankbar für eine hilfreiche Antwort! Danke jetzt schon einmal für das Durchlesen^^<br />
MfG Knickedi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1190964</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1190964</guid><dc:creator><![CDATA[Knickedi]]></dc:creator><pubDate>Wed, 13 Dec 2006 06:15:59 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Klasse: objektdatei + linker -&amp;gt; Fehler! ohne template gehts on Wed, 13 Dec 2006 06:46:35 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Bei Templates muss, bei den meisten Compilern, die Definition und Deklaration von der gleichen Compiliereinheit sichtbar sein. Meist werden Deklaration und Definition einfach in eine Datei gepackt (vorzugsweise Header ;)). Der Standard gibt zwar die Möglichkeit Templates zu exportieren, allerdings bieten das viele Compiler (die meisten) noch nicht an.</p>
<p>Außerdem stimmt dein Code nich ganz:</p>
<pre><code class="language-cpp">template &lt;class T1, class T2&gt; class klasse
{
public: // du willst test_func ja aufrufen
   void test_func();
};

// In der gleichen Datei definieren
template &lt;class T1, class T2&gt; void klasse&lt;T1,T2&gt;::test_func()
{
   std::cout &lt;&lt; &quot;Ich bin eine Testfunktion!&quot; &lt;&lt; std::endl;
}
</code></pre>
<pre><code class="language-cpp">int main()
{
   //klasse meine_klasse&lt;int,int&gt;;
   klasse&lt; int, int &gt; meine_klasse; // so, nicht wie in der Zeile darüber
   meine_klasse.test_func();
}
</code></pre>
<p>grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1190972</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1190972</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Wed, 13 Dec 2006 06:46:35 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Klasse: objektdatei + linker -&amp;gt; Fehler! ohne template gehts on Wed, 13 Dec 2006 06:47:46 GMT]]></title><description><![CDATA[<p>Hoi.</p>
<pre><code class="language-cpp">klasse meine_klasse&lt;int,int&gt;;
</code></pre>
<p>muss heissen:</p>
<pre><code class="language-cpp">klasse&lt;int,int&gt; meine_klasse;
</code></pre>
<p>Außerdem hast du in der Template-Klasse das public vergessen:</p>
<pre><code class="language-cpp">template &lt;class T1, class T2&gt; class klasse
{
public: // fehlt im Beispiel
   void test_func();
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1190974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1190974</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 13 Dec 2006 06:47:46 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Klasse: objektdatei + linker -&amp;gt; Fehler! ohne template gehts on Wed, 13 Dec 2006 11:53:25 GMT]]></title><description><![CDATA[<p>David_pb schrieb:</p>
<blockquote>
<p>Bei Templates muss, bei den meisten Compilern, die Definition und Deklaration von der gleichen Compiliereinheit sichtbar sein. Meist werden Deklaration und Definition einfach in eine Datei gepackt (vorzugsweise Header ;)). Der Standard gibt zwar die Möglichkeit Templates zu exportieren, allerdings bieten das viele Compiler (die meisten) noch nicht an.</p>
</blockquote>
<p>Ok, alles klar. Damit wäre mir geholfen... Danke!</p>
<p>schue  schrieb:</p>
<blockquote>
<p>Hoi.</p>
<pre><code class="language-cpp">klasse meine_klasse&lt;int,int&gt;;
</code></pre>
<p>muss heissen:</p>
<pre><code class="language-cpp">klasse&lt;int,int&gt; meine_klasse;
</code></pre>
<p>Außerdem hast du in der Template-Klasse das public vergessen:</p>
<pre><code class="language-cpp">template &lt;class T1, class T2&gt; class klasse
{
public: // fehlt im Beispiel
   void test_func();
};
</code></pre>
</blockquote>
<p>Hmm... Flüchtigkeitsfehler. Hab den Eintrag schnell vor der Schule geschrieben.</p>
<p>Ich danke euch beiden!<br />
Mit der Antwort von David_pb wäre ich soweit bedient (woher weiß man sowas?!)</p>
<p>Vielen Danek für die schnelle Antwort.</p>
<p>MfG Knickedi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191143</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191143</guid><dc:creator><![CDATA[Knickedi]]></dc:creator><pubDate>Wed, 13 Dec 2006 11:53:25 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Klasse: objektdatei + linker -&amp;gt; Fehler! ohne template gehts on Wed, 13 Dec 2006 11:56:41 GMT]]></title><description><![CDATA[<p>Knickedi schrieb:</p>
<blockquote>
<p>...(woher weiß man sowas?!)...</p>
</blockquote>
<p>Das steht z.Bsp. in der hiesigen <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39467.html" rel="nofollow">FAQ</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191145</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 13 Dec 2006 11:56:41 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Klasse: objektdatei + linker -&amp;gt; Fehler! ohne template gehts on Wed, 13 Dec 2006 12:10:35 GMT]]></title><description><![CDATA[<p>Knickedi schrieb:</p>
<blockquote>
<p>[(woher weiß man sowas?!)</p>
</blockquote>
<p>Sowas bekommt man im Laufe seiner Programmierzeit mit. Du weißt es jetzt ja auch! <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/1191157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191157</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Wed, 13 Dec 2006 12:10:35 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Klasse: objektdatei + linker -&amp;gt; Fehler! ohne template gehts on Wed, 13 Dec 2006 12:37:35 GMT]]></title><description><![CDATA[<p>Braunstein schrieb:</p>
<blockquote>
<p>Knickedi schrieb:</p>
<blockquote>
<p>...(woher weiß man sowas?!)...</p>
</blockquote>
<p>Das steht z.Bsp. in der hiesigen <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39467.html" rel="nofollow">FAQ</a></p>
</blockquote>
<p>Oder man überlegt es sich. Ein Funktionstemplate ist eben etwas völlig anderes als eine Templatefunktion. Traditionell und dem Konzept nach ist das Übersetzungsmodell so ausgelegt, dass Compiler bereits fertigen maschinenlesbaren Code erzeugt und der Linker lediglich noch externe Referenzen auflöst (die üblichweise den Code nur insoweit verändern, als dass noch ein paar Adressen 'eingepatched' werden müssen, was im Prinzip ein recht trivialer Vorgang ist). Für ein Funktionstemplate geht das aber schon im ersten Schritt schief - man kann ein Template nicht in maschinenlesbaren Code transformieren, das geht erst, wenn wir zusätzlich alle Argumente für das template kennen, und dann eine Templatefunktion haben. Diese Templatefunktion dagegen genügt dann wieder allen obigen Anforderungen und ist an sich eine ganz normale Funktion. Aber natürlich kann Compiler nicht spekulativ für alle möglichen Argumente im voraus spezialisieren und Code erzeugen - denn es gibt ja in der Regel sehr viele oder unendlich viele mögliche Argumente. Damit ist schon klar, dass obiger Code jedenfalls nach diesem einfachen Übersetzungsmodell nicht funktionieren kann. Der Sprachstandard sieht hier einmal das Schlüsselwort export vor. Das ist aber einerseits kaum implementiert und auch nicht ohne Probleme, andererseits ist auch klar, dass das, was da (in die Objektdatei) exportiert wird, doch etwas völlig anderes ist als gewöhnliche Funktionen. Andere Abhilfen ergeben sich aber auch zwingend logisch:<br />
- die Notwendigkeit, in main.cpp eine externe (also auf eine andere Übersetzungseinheit verweisende) Referenz zu benutzen, ergibt sich ja nur daraus, dass der Compiler in dieser Übersetzungseinheit nicht in der Lage ist, das Template zu spezialisieren. Und zwar einfach deshalb, weil er dort die Definition des Templates nicht kennt. Beseitigen wir letzteres entfällt auch ersteres (wie in David_pbs Beitrag)<br />
- die andere Möglichkeit setzt am Punkt des &quot;spekulativen&quot; Spezialisierens an. Der Compiler kann nicht wissen, welche Spezialisierungen in anderen Übersetzungseinheiten gebraucht werden und er kann hier auch keine Vorkehr treffen. Der Programmierer hat dieses Problem nicht: Durch explizite (oder implizite) Instanziierung in einer Übersetzungseinheit die die Templatedefinition kennt, werden diese Spezialisierungen (da es sich um normale Funktionen handelt) für alle Übersetzungseinheiten unmittelbar nutzbar. ein</p>
<pre><code class="language-cpp">template klasse&lt;int,int&gt;;
</code></pre>
<p>in klasse.cpp würde das Problem auch lösen.</p>
<p>Man hat also prinzipiell 3 Möglichkeiten, das Problem zu lösen, wobei die Variante mit export - vor allem mangels Compilerunterstützung - keine praktische Bedeutung hat. Unter den anderen beiden Möglichkeiten wird man dort, wo es möglich ist, in der Regel die wählen, die die Templatedefinition überall sichtbar macht. Zwar wird mit beiden Verfahren das Prinzip der Kapselung im Grunde durchbrochen, der zweite Fall führt aber doch zu deutlich größeren organisatorischen Abhängigkeiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191178</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 13 Dec 2006 12:37:35 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Klasse: objektdatei + linker -&amp;gt; Fehler! ohne template gehts on Wed, 13 Dec 2006 17:45:51 GMT]]></title><description><![CDATA[<p>Danke für den sehr ausführlichen Beitrag.<br />
Wirklich mit Leib und Seele dabei...</p>
<p>Also um das kurz und knapp zu fassen (damit ich das auch wirklich richtig verstehe):<br />
1. <em>export</em> vor die Deklaration im Header. Wird aber nicht von jedem Compiler unterstützt (wie ich auch gemerkt habe).<br />
2. &quot;Alles&quot; in einen Header packen und diesen inkludieren. Dann wird die Klasse aber jedes mal mitcompiliert.<br />
3. Der Programmierer spezialisiert sich in der cpp-Datei auf einen Typ des Templates, aber so kann er auch dann nur diesen verwenden.</p>
<p>Ich hoffe, dass es richtig angekommen ist...</p>
<p>Aber jetzt stellt sich mir eine Frage:<br />
Wenn ich keine Möglichkeit habe die Klasse als Template in einer Objektdatei auszulagern ohne mich zu spezialisieren oder alles immer neuzucompilieren, wie kriegt der Compiler das mit der STL hin?<br />
Schaff ich das auch? Oder sollte ich die Finger davon lassen?<br />
Nicht dass ich daran scheitere, weil ich die Klasse nicht getrennt compilieren kann, es ist reine Neugier...</p>
<p>MfG Knickedi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191357</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191357</guid><dc:creator><![CDATA[Knickedi]]></dc:creator><pubDate>Wed, 13 Dec 2006 17:45:51 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Klasse: objektdatei + linker -&amp;gt; Fehler! ohne template gehts on Wed, 13 Dec 2006 19:04:10 GMT]]></title><description><![CDATA[<p>Knickedi schrieb:</p>
<blockquote>
<p>1. <em>export</em> vor die Deklaration im Header. Wird aber nicht von jedem Compiler unterstützt</p>
</blockquote>
<p>Eigentlich von so gut wie keinem. AFAIK unterstützt zB der Comeau export.</p>
<p>Knickedi schrieb:</p>
<blockquote>
<p>2. &quot;Alles&quot; in einen Header packen und diesen inkludieren. Dann wird die Klasse aber jedes mal mitcompiliert.</p>
</blockquote>
<p>Eigentlich übersetzt ein Compiler nur das, was auch wirklich instanziert wird. Es ist also nicht so, dass immer sämtliche Templates neu kompiliert werden. Wäre auch ziemlich ineffizient.</p>
<p>Knickedi schrieb:</p>
<blockquote>
<p>Wenn ich keine Möglichkeit habe die Klasse als Template in einer Objektdatei auszulagern ohne mich zu spezialisieren oder alles immer neuzucompilieren, wie kriegt der Compiler das mit der STL hin?</p>
</blockquote>
<p>Die Implementation der STL befindet sich doch auch grösstenteils in Headern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191391</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Wed, 13 Dec 2006 19:04:10 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Klasse: objektdatei + linker -&amp;gt; Fehler! ohne template gehts on Wed, 13 Dec 2006 19:23:00 GMT]]></title><description><![CDATA[<p>groovemaster schrieb:</p>
<blockquote>
<p>Die Implementation der STL befindet sich doch auch grösstenteils in Headern.</p>
</blockquote>
<p>Ich hatte mal irgendwo aufgeschnappt, dass in den Headern &quot;nur&quot; die Deklarationen stehen und Bibliotheken automatisch aufgrund von inkludiereten Dateien aus dem Library-Verzeichnis des Compilers dazugelinkt werden...</p>
<p>Naja, will hier auch keinem weiter zur Last fallen und vom Thema abweichen.<br />
Meine Frage wurde ja eigentlich schon beantwortet.</p>
<p>Danke nochmal!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191398</guid><dc:creator><![CDATA[Knickedi]]></dc:creator><pubDate>Wed, 13 Dec 2006 19:23:00 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Klasse: objektdatei + linker -&amp;gt; Fehler! ohne template gehts on Wed, 13 Dec 2006 20:17:04 GMT]]></title><description><![CDATA[<p>Knickedi schrieb:</p>
<blockquote>
<p>Ich hatte mal irgendwo aufgeschnappt, dass in den Headern &quot;nur&quot; die Deklarationen stehen</p>
</blockquote>
<p>Was ja auch richtig ist. Aber aufgrund des fehlenden Supports von export bilden Templates hier eine Ausnahme.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191416</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Wed, 13 Dec 2006 20:17:04 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Klasse: objektdatei + linker -&amp;gt; Fehler! ohne template gehts on Thu, 14 Dec 2006 08:13:22 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>...Ein Funktionstemplate ist eben etwas völlig anderes als eine Templatefunktion....</p>
</blockquote>
<p>Ist diese Nomenklatur eigentlich verbreitet/standardisiert ?<br />
Ich erinnere mich nur daran, dass man &quot;Funktions-/Klassentemplate&quot; sagen sollte für</p>
<pre><code class="language-cpp">template &lt;typename T&gt; 
void f(void);

template &lt;typename T&gt; 
class C;
</code></pre>
<p>und nicht &quot;Templatefunktion/-klasse&quot; (um eben klarzustellen, dass es eine Schablone ist).<br />
Das, was der Compiler daraus macht, kenne ich nur als &quot;Instanz&quot; eines (Funktions-/Klassen-)Templates.<br />
Mir fällt allerdings gerade nicht ein, wo ich das gelesen haben (Sutter ? Vandevoorde/Josuttis ? ...)</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191534</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 14 Dec 2006 08:13:22 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Klasse: objektdatei + linker -&amp;gt; Fehler! ohne template gehts on Thu, 14 Dec 2006 11:38:54 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>...Ein Funktionstemplate ist eben etwas völlig anderes als eine Templatefunktion....</p>
</blockquote>
<p>Ist diese Nomenklatur eigentlich verbreitet/standardisiert ?<br />
Ich erinnere mich nur daran, dass man &quot;Funktions-/Klassentemplate&quot; sagen sollte für</p>
<pre><code class="language-cpp">template &lt;typename T&gt; 
void f(void);

template &lt;typename T&gt; 
class C;
</code></pre>
<p>und nicht &quot;Templatefunktion/-klasse&quot; (um eben klarzustellen, dass es eine Schablone ist).<br />
Das, was der Compiler daraus macht, kenne ich nur als &quot;Instanz&quot; eines (Funktions-/Klassen-)Templates.<br />
Mir fällt allerdings gerade nicht ein, wo ich das gelesen haben (Sutter ? Vandevoorde/Josuttis ? ...)</p>
<p>Gruß,</p>
<p>Simon2.</p>
</blockquote>
<p>Man könnte sagen, dass sie standardisiert ist, weil sie bereits in der Sprachdefinition angelegt ist. Die Verwirrung entsteht für den Anfänger vor allem dadurch, dass man (gerade am Anfang in einfachen Fällen ohne Spezialisierung) häufig einfach ein Funktionstemplate definiert, und anschließend ganz normale Funktionsaufrufe (ohne explizite Angabe der Argumente) durchführt. So entsteht natürlich leicht der Eindruck, dass das, was definiert wurde, bereits eine Funktion ist. Denn der Vorgang der Deduktion der Templateargumente und die Instantiierung für diese Argumente ist ja völlig automatisch und implizit. Außerdem gibt es ja beide Begriffe, die des Funktionstemplates als auch der Templatefunktion, die zudem in einem Zusammenhang stehen und daher auch häufig gemeinsam in einem Text auftauchen. Letzteres Problem betrifft dann auch Klassentemplates bzw. Templateklassen (als die konkreten Instanzen eines Klassentemplates). Im Grunde ist es ganz einfach: ein Template ist etwas, das noch durch Parameter näher bestimmt werden muss, und wir nennen es entweder Funktions- oder Klassentemplate, je nachdem, was durch diese Vorlage generiert werden soll, während eine Klasse bzw. Funktion eben gerade keine solchen (Template-)Parameter hat, und wir nennen das dann eine Templateklasse bzw. -funktion, um anzuzeigen, dass dieses Etwas auf ein Template zurückgeht. Wichtig wird diese Unterscheidung noch bei expliziten Templatespezialisierungen. Eine explizite Templatespezialisierung ist <em><strong>kein</strong></em> Template. Das hat wesentliche Auswirkungen auf die ODR. Ein Funktionstemplate muss (nach dieser Lösungsmöglichkeit aus den vorhergehenden Beiträgen) in jeder Übersetzungseinheit definiert werden, in der es gebraucht wird. Eine explizite Spezialisierung dieses Templates ist dagegen eine Funktion und hat damit linkage und unterliegt folglich der ODR (also nur eine Definition im Programm bei extern, es sei denn, wir machen sie inline).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191669</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 14 Dec 2006 11:38:54 GMT</pubDate></item></channel></rss>