<?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: Frage zum Konstruktor]]></title><description><![CDATA[<p>Ich beschäftige mich gerade mit Templates. Nun hab will ich einen Template-Konstruktor schreiben, der mir zwei Variablen initialisiert:</p>
<pre><code class="language-cpp">template&lt;typename T, typename S&gt; class Test
{
private:
	T var1;
	T var2;

public:
	Test();
};
</code></pre>
<pre><code class="language-cpp">template&lt;typename T, typename S&gt; Test&lt;T,S&gt;::Test() : var1(0), var2(0)
{

}
</code></pre>
<p>Mit dem obigen Code bekomme ich aber einen Linker Error. Benutzte IDE/Compiler: VS2010. LinkerFehler:<br />
Fehler 1 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol &quot;&quot;public: __thiscall Test&lt;int,int&gt;::Test&lt;int,int&gt;(void)&quot; (??0?$Test@HH@@QAE@XZ)&quot; in Funktion &quot;_main&quot;.</p>
<p>Fehler 2 error LNK1120: 1 nicht aufgelöste externe Verweise.</p>
<p>Wo ist da nun der Fehler? Diesen LinkerFehler kenn ich eigentlich nur immer davon, wenn ich eine Methode in der h-Datei deklariert habe, diese aber dann nicht implemeniert habe. Das ist hier aber nun nicht der Fall...</p>
<p>Edit: Achja, aufrufen tu ich das ganze dann so:</p>
<pre><code class="language-cpp">Test&lt;int, int&gt; A;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/305779/template-frage-zum-konstruktor</link><generator>RSS for Node</generator><lastBuildDate>Sat, 08 Aug 2026 14:28:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/305779.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 08 Jul 2012 15:59:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template: Frage zum Konstruktor on Sun, 08 Jul 2012 16:00:16 GMT]]></title><description><![CDATA[<p>Ich beschäftige mich gerade mit Templates. Nun hab will ich einen Template-Konstruktor schreiben, der mir zwei Variablen initialisiert:</p>
<pre><code class="language-cpp">template&lt;typename T, typename S&gt; class Test
{
private:
	T var1;
	T var2;

public:
	Test();
};
</code></pre>
<pre><code class="language-cpp">template&lt;typename T, typename S&gt; Test&lt;T,S&gt;::Test() : var1(0), var2(0)
{

}
</code></pre>
<p>Mit dem obigen Code bekomme ich aber einen Linker Error. Benutzte IDE/Compiler: VS2010. LinkerFehler:<br />
Fehler 1 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol &quot;&quot;public: __thiscall Test&lt;int,int&gt;::Test&lt;int,int&gt;(void)&quot; (??0?$Test@HH@@QAE@XZ)&quot; in Funktion &quot;_main&quot;.</p>
<p>Fehler 2 error LNK1120: 1 nicht aufgelöste externe Verweise.</p>
<p>Wo ist da nun der Fehler? Diesen LinkerFehler kenn ich eigentlich nur immer davon, wenn ich eine Methode in der h-Datei deklariert habe, diese aber dann nicht implemeniert habe. Das ist hier aber nun nicht der Fall...</p>
<p>Edit: Achja, aufrufen tu ich das ganze dann so:</p>
<pre><code class="language-cpp">Test&lt;int, int&gt; A;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2231037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231037</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Sun, 08 Jul 2012 16:00:16 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Frage zum Konstruktor on Sun, 08 Jul 2012 16:05:23 GMT]]></title><description><![CDATA[<p>Lies mal unter <a href="http://www.c-plusplus.net/forum/151578" rel="nofollow">häufig gestellte Fragen</a> unter Punkt 5.</p>
<p>Dazu noch <a href="http://www.c-plusplus.net/forum/p1993089#1993089" rel="nofollow">http://www.c-plusplus.net/forum/p1993089#1993089</a> von wxSkip ab Punkt 4.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231038</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Sun, 08 Jul 2012 16:05:23 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Frage zum Konstruktor on Sun, 08 Jul 2012 16:13:25 GMT]]></title><description><![CDATA[<p>Zitat aus die &quot;meistgestellten Fragen&quot;:</p>
<blockquote>
<p>Mögliche Workarounds:<br />
- alles direkt in die Klassendefinition einfügen; das wird bei großen Templates ziemlich unübersichtlich<br />
- am Ende der Header-Datei eine Implementationsdatei inkludieren, in der die Member definiert werden (üblicherweise hat diese die Endung .impl)<br />
- die gewünschten Template-Instanzen explizit definieren<br />
- das Schlüsselwort export benutzen; allerdings gibt es kaum Compiler, die dieses unterstützen</p>
</blockquote>
<p>Punkt 1 will ich nicht, da es meiner Ansicht nach schlechter Stil ist.</p>
<p>Punkt 2 hört sich schon eher nach dem an was ich will. Leider hab ich dazu nirgends was gefunden, wie das mit dieser Implementationsdatei funktioniert. Wie würdest du da vorgehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231040</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Sun, 08 Jul 2012 16:13:25 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Frage zum Konstruktor on Sun, 08 Jul 2012 16:22:16 GMT]]></title><description><![CDATA[<p>das was du von Punkt 1 nicht willst, in die zweite Datei auslagern</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231044</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231044</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Sun, 08 Jul 2012 16:22:16 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Frage zum Konstruktor on Sun, 08 Jul 2012 17:08:31 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/15576">@KN4CK3R</a>: Aber genau das ist ja das Problem... Ich will quasi bis auf die Definition des Templates aus der Klasse alles draußen haben und genau deswegen hat mir ja icarus2 genau den Link mit den Tips geschickt...</p>
<p>Anderes Problem: Ich hab mich jetzt mal dazu hinreissen lassen, die Implementation des Template-Konstruktors in der header-Datei zu machen. Dabei hab ich nun zwei Konstruktion definiert. Einen der über die Konstruktorliste die zwar Variablen der Klasse mit einem Standardwert initialisiert und einen Template-Konstruktor, der mir über von der main übergebene Werte über die Konstruktorliste an den Konstruktor &quot;weiterleitet&quot;. Dabei hab ich folgendes festegestellt:</p>
<pre><code class="language-cpp">Test&lt;T,S&gt;::Test() : var1(0), var2(0)  //Konstruktor 1
	{

	}

	Test&lt;T,S&gt;::Test(T v1, S v2) : var1(v1), var2(v2)  /Konstruktor 2
	{

	}
</code></pre>
<p>So wie es jetzt da steht meckert der Compiler mit 17 Fehler. Ich kann die Fehler hier jetzt nicht posten. Das sind zu viele. Wenn ich aber nun bei Konstruktor 2 das</p>
<pre><code class="language-cpp">Test&lt;T,S&gt;::
</code></pre>
<p>weglasse, dann kompiliert er ohne zu meckern. Bei Konstruktor 1 macht das Vorhanden- oder nicht Vorhandensein von</p>
<pre><code class="language-cpp">Test&lt;T,S&gt;::
</code></pre>
<p>keinen Unterschied. Dieser wird IMMER kompiliert.</p>
<p>-&gt; Warum ist das so?</p>
<p>Weitere Frage:</p>
<p>Ich hab mir jetzt zur Abwechslung mal eine von Klassen unabhängige Funktion geschrieben. Diese Funktion soll zwei übergebene Variablen miteinander addieren.</p>
<pre><code class="language-cpp">template&lt;typename T1, typename T2&gt; T1 add(T1 a, T2 b)
{
	return a+b;
}
</code></pre>
<p>Der return-Wert hängt also vom Aufruf der Funktion add aus der main ab. Wenn ich die Funktion add nun so aufrufe</p>
<pre><code class="language-cpp">add(5,5)
</code></pre>
<p>ist der return-Wert ein int, da der erste Parameter des Funktionsaufrufs ein int ist und in der Funktion als return-Wert der erste Parameter gewählt wurde. Soweit so gut. Wenn ich nun</p>
<pre><code class="language-cpp">add(5.5,5)
</code></pre>
<p>aufrufe, dann bekomm ich welchen Wert zurück? float oder double? Das verstehe ich nun nicht. Es ist klar, wenn ich den return-Wert der template-Funktion in eine double-Variable speichern lasse, dann ist logischerweise der return-Wert ein double. So lange die übergebene Gleitkommazahl kleiner als float ist, ist das ja kein Problem. Wenn ich aber eine &quot;echte&quot; double-Zahl übergebe, dann wird es schwierig. Deshalb meine Frage: Gibt es eine Variablendefinition innerhalb der main, die der Compiler ad-hoc wählt, sobald er weiß, welcher Typ von der template-Funktion zurückgeliefert wird? Versteht ihr was ich meine?</p>
<p>Was passiert eigentlich wenn ich obige Funktion folgendermaßen aufrufe:</p>
<pre><code class="language-cpp">add(5,5.5)
</code></pre>
<p>? Dann bekomm ich einen int zurück und die Nachkommastellen werden verschluckt? Hier liegt also der Programmierer in seiner Verantwortung, oder wie?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231046</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Sun, 08 Jul 2012 17:08:31 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Frage zum Konstruktor on Sun, 08 Jul 2012 17:20:24 GMT]]></title><description><![CDATA[<p>Ich denke es muss heissen</p>
<pre><code class="language-cpp">template&lt;typename T, typename S&gt;
Test&lt;T,S&gt;::Test() : var1(0), var2(0)  //Konstruktor 1 
    { 

    }
</code></pre>
<p>Zur 'weiteren Frage': Probiers halt mal aus <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/2231053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231053</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Sun, 08 Jul 2012 17:20:24 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Frage zum Konstruktor on Sun, 08 Jul 2012 18:02:27 GMT]]></title><description><![CDATA[<p>vip@r schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Test&lt;T,S&gt;::Test() : var1(0), var2(0)  //Konstruktor 1
	{

	}

	Test&lt;T,S&gt;::Test(T v1, S v2) : var1(v1), var2(v2)  /Konstruktor 2
	{

	}
</code></pre>
<p>So wie es jetzt da steht meckert der Compiler mit 17 Fehler. Ich kann die Fehler hier jetzt nicht posten. Das sind zu viele. Wenn ich aber nun bei Konstruktor 2 das</p>
<pre><code class="language-cpp">Test&lt;T,S&gt;::
</code></pre>
<p>weglasse, dann kompiliert er ohne zu meckern. Bei Konstruktor 1 macht das Vorhanden- oder nicht Vorhandensein von</p>
<pre><code class="language-cpp">Test&lt;T,S&gt;::
</code></pre>
<p>keinen Unterschied. Dieser wird IMMER kompiliert.</p>
<p>-&gt; Warum ist das so?</p>
</blockquote>
<p>keine Ahnung. Das ist offensichtlich nicht <em>exakt</em> der Code, wie du ihn dem Compiler präsentierst. Da Compiler notwendigerweise pedantisch sind, müssen wir es <a href="http://www.c-plusplus.net/forum/304133" rel="nofollow">auch</a> sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231061</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 08 Jul 2012 18:02:27 GMT</pubDate></item><item><title><![CDATA[Reply to Template: Frage zum Konstruktor on Sun, 08 Jul 2012 19:13:41 GMT]]></title><description><![CDATA[<blockquote>
<p>Test&lt;T,S&gt;::Test(T v1, S v2) : var1(v1), var2(v2) /Konstruktor 2<br />
{</p>
<p>}</p>
</blockquote>
<p>Das macht doch nicht einmal sinn. Keiner definiert, wie S und T ineinander konvertierbar sind.</p>
<p>Implementations-dateien sind soweit ich es verstanden habe nur ein anderer Header, der die Implementationen enthält (ich bspw. inkludiere ihn einfach nach der Klassendefinition direkt im Header).</p>
<blockquote>
<p>ist der return-Wert ein int, da der erste Parameter des Funktionsaufrufs ein int ist</p>
</blockquote>
<p>Das ist im Standard definiert - welche Typen Literale haben.</p>
<blockquote>
<pre><code class="language-cpp">add(5.5,5)
</code></pre>
<p>aufrufe, dann bekomm ich welchen Wert zurück? float oder double? Das verstehe ich nun nicht.</p>
</blockquote>
<p>.<br />
Deine Version dürfte gar nicht kompilieren, da hier der Template-parameter nicht deduziert werden kann.</p>
<p>P.S.: Wenn du bei Fließkommazahlliteralen nicht explizit das <em>f</em>-Suffix angibst, dann (siehe Standard) ist es ein <code>double</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2231074</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2231074</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 08 Jul 2012 19:13:41 GMT</pubDate></item></channel></rss>