<?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 Functions funktioneren nicht]]></title><description><![CDATA[<p>Huhu</p>
<p>Ich habe mal etwas gebastelt, um die Templates kurz zu repetieren und etwas mit namespaces zu machen.</p>
<p>Dabei habe ich folgenden, einfachen Code erstellt:</p>
<pre><code class="language-cpp">#include &quot;BasicArithmeticOperations.h&quot;

namespace my_math
{
	template&lt;typename T&gt;
	T add(T a, T b){
		return a + b;
	}

	template&lt;typename T&gt;
	T subtract(T a, T b) {
		return a - b;
	}
}
</code></pre>
<p>(Es ist schon richtig typename und nicht class zu verwenden, oder?)</p>
<p>Daszu das header-file:</p>
<pre><code class="language-cpp">#ifndef BASIC_ARITHMETIC_INCLUDED
#define BASIC_ARITHMETIC_INCLUDED

namespace my_math {

	template&lt;typename T&gt;
	T add(T a, T b);

	template&lt;typename T&gt;
	T subtract(T a, T b);
}

#endif
</code></pre>
<p>In der Testklasse gibt es dann jedoch einen Fehler:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;BasicArithmeticOperations.h&quot;

int main(){

	using std::cout;
	using std::cin;
	using std::endl;
	using my_math::add;

	int a = 10;
	int b = 20;

	cout &lt;&lt; add(a, b) &lt;&lt; endl;

	int exit;
	cin &gt;&gt; exit;
	return 0;
}
</code></pre>
<p>Die Fehlermeldung:</p>
<blockquote>
<p>CodeTest.obj : error LNK2019: unresolved external symbol &quot;int __cdecl my_math::add&lt;int&gt;(int,int)&quot; (??$add@H@my_math@@YAHHH@Z) referenced in function _main<br />
//...<br />
Help Classes - 2 error(s), 0 warning(s)<br />
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========</p>
</blockquote>
<p>Ich kann mir beim besten Willen nicht vorstellen, was an meinem Code falsch ist. Eigentlich müsste alles funktionieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/257019/template-functions-funktioneren-nicht</link><generator>RSS for Node</generator><lastBuildDate>Thu, 10 Sep 2026 17:03:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/257019.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 21 Dec 2009 15:10:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template Functions funktioneren nicht on Mon, 21 Dec 2009 15:11:44 GMT]]></title><description><![CDATA[<p>Huhu</p>
<p>Ich habe mal etwas gebastelt, um die Templates kurz zu repetieren und etwas mit namespaces zu machen.</p>
<p>Dabei habe ich folgenden, einfachen Code erstellt:</p>
<pre><code class="language-cpp">#include &quot;BasicArithmeticOperations.h&quot;

namespace my_math
{
	template&lt;typename T&gt;
	T add(T a, T b){
		return a + b;
	}

	template&lt;typename T&gt;
	T subtract(T a, T b) {
		return a - b;
	}
}
</code></pre>
<p>(Es ist schon richtig typename und nicht class zu verwenden, oder?)</p>
<p>Daszu das header-file:</p>
<pre><code class="language-cpp">#ifndef BASIC_ARITHMETIC_INCLUDED
#define BASIC_ARITHMETIC_INCLUDED

namespace my_math {

	template&lt;typename T&gt;
	T add(T a, T b);

	template&lt;typename T&gt;
	T subtract(T a, T b);
}

#endif
</code></pre>
<p>In der Testklasse gibt es dann jedoch einen Fehler:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;BasicArithmeticOperations.h&quot;

int main(){

	using std::cout;
	using std::cin;
	using std::endl;
	using my_math::add;

	int a = 10;
	int b = 20;

	cout &lt;&lt; add(a, b) &lt;&lt; endl;

	int exit;
	cin &gt;&gt; exit;
	return 0;
}
</code></pre>
<p>Die Fehlermeldung:</p>
<blockquote>
<p>CodeTest.obj : error LNK2019: unresolved external symbol &quot;int __cdecl my_math::add&lt;int&gt;(int,int)&quot; (??$add@H@my_math@@YAHHH@Z) referenced in function _main<br />
//...<br />
Help Classes - 2 error(s), 0 warning(s)<br />
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========</p>
</blockquote>
<p>Ich kann mir beim besten Willen nicht vorstellen, was an meinem Code falsch ist. Eigentlich müsste alles funktionieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1825924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1825924</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Mon, 21 Dec 2009 15:11:44 GMT</pubDate></item><item><title><![CDATA[Reply to Template Functions funktioneren nicht on Mon, 21 Dec 2009 15:14:58 GMT]]></title><description><![CDATA[<p>templates implementierung IMMER im Header!<br />
Außer du includierst im Header die Implementierungs-Datei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1825927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1825927</guid><dc:creator><![CDATA[sanyas]]></dc:creator><pubDate>Mon, 21 Dec 2009 15:14:58 GMT</pubDate></item><item><title><![CDATA[Reply to Template Functions funktioneren nicht on Mon, 21 Dec 2009 15:20:20 GMT]]></title><description><![CDATA[<p>sanyas schrieb:</p>
<blockquote>
<p>Außer du includierst im Header die Implementierungs-Datei.</p>
</blockquote>
<p>Implementierungsdateien sollte man nicht inkludieren. Folglich muss die Definition von Templates <strong>immer</strong> in Headerdateien stehen ( <code>export</code> wird sowieso kaum unterstützt).</p>
<p>Was man aber machen kann, um Schnittstelle und Implementierung zu trennen – was ich im Übrigen selbst oft so handhabe – ist eine separate Headerdatei, die am Ende der eigentlichen eingebunden wird.</p>
<pre><code class="language-cpp">// --- BasicArithmetic.hpp ---
// hier Deklarationen
#include &quot;BasicArithmetic.inl&quot;

// --- BasicArithmetic.inl ---
// hier Definitionen
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1825931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1825931</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 21 Dec 2009 15:20:20 GMT</pubDate></item><item><title><![CDATA[Reply to Template Functions funktioneren nicht on Mon, 21 Dec 2009 15:20:07 GMT]]></title><description><![CDATA[<p>Heisst also, dass man es so lösen sollte?</p>
<pre><code class="language-cpp">#ifndef BASIC_ARITHMETIC_INCLUDED
#define BASIC_ARITHMETIC_INCLUDED

#include &quot;BasicArithmeticOperations.cpp&quot;

namespace my_math {

	template&lt;typename T&gt;
	T add(T a, T b);

	template&lt;typename T&gt;
	T subtract(T a, T b);
}

#endif
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1825934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1825934</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Mon, 21 Dec 2009 15:20:07 GMT</pubDate></item><item><title><![CDATA[Reply to Template Functions funktioneren nicht on Mon, 21 Dec 2009 15:20:56 GMT]]></title><description><![CDATA[<p>icarus2 schrieb:</p>
<blockquote>
<p>Heisst also, dass man es so lösen sollte?</p>
</blockquote>
<p>Nein, inkludier keine .cpp-Dateien! Ich habe in meinem oberen Post beschrieben, wie du es machen kannst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1825936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1825936</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 21 Dec 2009 15:20:56 GMT</pubDate></item><item><title><![CDATA[Reply to Template Functions funktioneren nicht on Mon, 21 Dec 2009 15:28:29 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>sanyas schrieb:</p>
<blockquote>
<p>Außer du includierst im Header die Implementierungs-Datei.</p>
</blockquote>
<p>Implementierungsdateien sollte man nicht inkludieren. Folglich muss die Definition von Templates <strong>immer</strong> in Headerdateien stehen ( <code>export</code> wird sowieso kaum unterstützt).</p>
</blockquote>
<p>Ich hab das eiegntlich genau so gemeint, wie du es dann unten machst <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Wenn man unbedingt Header und Implementierung trennen will, dann muss man die Implementierungsdatei (ob man die jetzt .inl, .impl, .tmplimpl, .tpp, ... nennt ist egal) nach der Deklaration includen.</p>
<p>Ein &quot;.cpp&quot; als template-Implementierung zu nehmen, ist ungünstig, da .cpp eigentlich impliziert &quot;kompilier mich separat&quot;. Und das geht mit templates nicht.<br />
Templates sind eine Vorlage. Es wird, wenn du die Funktion (oder auch Klasse) das erste mal mit einem bestimmten Typ verwendest, Code generiert und kompiliert. Damit der Compiler diesen Code generieren kann, muss ihm die komplette Implementierung bekannt sein, weshalb eben alles in einer Datei stehen muss - Der compiler kann ja jetzt schlecht raten, wie die Datei mit der Implementierung heißt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1825944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1825944</guid><dc:creator><![CDATA[sanyas]]></dc:creator><pubDate>Mon, 21 Dec 2009 15:28:29 GMT</pubDate></item><item><title><![CDATA[Reply to Template Functions funktioneren nicht on Mon, 21 Dec 2009 15:36:50 GMT]]></title><description><![CDATA[<p>Ersma Danke für eure Beiträge <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>
<p>Ich habe jetzt mal etwas gebastelt, aber ich habe atm ziemlich Mühe mit dem ganzen <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=":-/"
      alt="😕"
    /></p>
<p>Ich habe jetzt einmal versucht eure Vorschläge umzusetzen (sry, wenn das wieder nicht gut ist, ich habe im Moment etwas Mühe mit dem ganzen).</p>
<p>Passt das so?<br />
Das Header-file als Schnittstelle:<br />
BasicArithmeticOperations.h</p>
<pre><code class="language-cpp">#ifndef BASIC_ARITHMETIC_INCLUDED
#define BASIC_ARITHMETIC_INCLUDED

namespace my_math {

	template&lt;typename T&gt;
	T add(T a, T b);

	template&lt;typename T&gt;
	T subtract(T a, T b);
}

#include &quot;BasicArithmetic.inl.h&quot;

#endif
</code></pre>
<p>Und dann noch die eigentliche Implementierung der Methoden im separaten Header-file BasicArithmetic.inl.h</p>
<pre><code class="language-cpp">#ifndef BASIC_ARITHMETIC_INL
#define BASIC_ARITHMETIC_INL

namespace my_math {
	template&lt;typename T&gt;
	T add(T a, T b){
		return a + b;
	}

	template&lt;typename T&gt;
	T subtract(T a, T b){
		return a - b;
	}
}

#endif
</code></pre>
<p>Das .cpp file habe ich jetzt vollständig weggelassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1825949</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1825949</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Mon, 21 Dec 2009 15:36:50 GMT</pubDate></item><item><title><![CDATA[Reply to Template Functions funktioneren nicht on Mon, 21 Dec 2009 15:40:16 GMT]]></title><description><![CDATA[<p>Ja, kann man so machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1825952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1825952</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 21 Dec 2009 15:40:16 GMT</pubDate></item><item><title><![CDATA[Reply to Template Functions funktioneren nicht on Mon, 21 Dec 2009 15:42:00 GMT]]></title><description><![CDATA[<p>Ja, grundsätzlich ist das richtig. Allerdings kannst du gleich die Dateiendung .inl nehmen statt .inl.h, ausserdem brauchst du keine Include-Guards in der .inl-Datei, weil sie nur an einem Ort (in der .h- oder .hpp-Datei) eingebunden wird, wo bereits Guards stehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1825953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1825953</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 21 Dec 2009 15:42:00 GMT</pubDate></item><item><title><![CDATA[Reply to Template Functions funktioneren nicht on Mon, 21 Dec 2009 15:47:01 GMT]]></title><description><![CDATA[<p>Was ist der Unterschied zwischen .inl und .h? Oder besser gesagt... wann nimmt man .h und wann nimmt man .inl?</p>
<p>Aber die include-Guards schaden ja auch nicht wirlich, oder? Falls es doch von mehreren files includiert werden würde, so besteht die Gefahr nicht, dass diese vergessen gehen. Oder liege ich da falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1825955</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1825955</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Mon, 21 Dec 2009 15:47:01 GMT</pubDate></item><item><title><![CDATA[Reply to Template Functions funktioneren nicht on Mon, 21 Dec 2009 15:50:43 GMT]]></title><description><![CDATA[<p>icarus2 schrieb:</p>
<blockquote>
<p>Was ist der Unterschied zwischen .inl und .h? Oder besser gesagt... wann nimmt man .h und wann nimmt man .inl?</p>
</blockquote>
<p>Es spielt eigentlich keine Rolle. Ich mache es allerdings so, dass Schnittstellen in .hpp-Dateien stehen, und Implementierungen von Templates in .inl-, ansonsten .cpp-Dateien.</p>
<p>Ist auch etwas Geschmackssache, aber .inl.h habe ich jetzt noch nie gesehen. <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>
<p>icarus2 schrieb:</p>
<blockquote>
<p>Aber die include-Guards schaden ja auch nicht wirlich, oder? Falls es doch von mehreren files includiert werden würde, so besteht die Gefahr nicht, dass diese vergessen gehen. Oder liege ich da falsch?</p>
</blockquote>
<p>Sie schaden nicht, aber sie sind sinnlos. Template-Implementierungsdateien sollten immer nur von einer Datei inkludiert werden (dem zugehörigen Schnittstellen-Header).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1825959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1825959</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 21 Dec 2009 15:50:43 GMT</pubDate></item><item><title><![CDATA[Reply to Template Functions funktioneren nicht on Mon, 21 Dec 2009 15:53:37 GMT]]></title><description><![CDATA[<p>Ok, soweit ich das sehe macht dein System mit den Endungen Sinn <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>
<p>Vielen Danke für alle eure Beiträge, haben mir sehr geholfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1825966</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1825966</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Mon, 21 Dec 2009 15:53:37 GMT</pubDate></item><item><title><![CDATA[Reply to Template Functions funktioneren nicht on Mon, 21 Dec 2009 16:01:48 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Sie schaden nicht, aber sie sind sinnlos.</p>
</blockquote>
<p>Natürlich schaden sie: Sie müssen ausgewertet werden und kosten somit CPU-Power und Compile-Zeit :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1825975</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1825975</guid><dc:creator><![CDATA[Powerhero]]></dc:creator><pubDate>Mon, 21 Dec 2009 16:01:48 GMT</pubDate></item><item><title><![CDATA[Reply to Template Functions funktioneren nicht on Mon, 21 Dec 2009 16:05:30 GMT]]></title><description><![CDATA[<p>Alles klar, ich werde sie rausnehmen... bevor ich meine CPU noch zum explodieren bringe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1825980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1825980</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Mon, 21 Dec 2009 16:05:30 GMT</pubDate></item></channel></rss>