<?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[[gelöst] Linkerfehler bei template member-Funktion, obwohl explizit instantiiert]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Klasse mit einer Template-Memberfunktion. Alle instantiierungen sind vorher schon bekannt. Ich möchte die Funktion ungern im .h-File inlinen, sondern im .cpp file stehen lassen.</p>
<p>Damit das gut geht, muss ich den Compiler ja zwingen, sie einmal explizit zu instantiieren, für alle Paramter die auftreten werden.</p>
<p>Trotzdem erhalte ich beim linken der Applikation einen Linkerfehler.</p>
<p>Die .h-Datei:</p>
<pre><code class="language-cpp">class Foo {
public:
    template &lt;typename T&gt;
    void bar (T* t);
};

template void Foo::bar&lt;int&gt;(int* t);
template void Foo::bar&lt;float&gt;(float* t);
</code></pre>
<p>die .cpp-Datei:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
void Foo::bar(T* t)
{
    frobnicate(t);
}
</code></pre>
<p>Beim Linken erhalte ich dann den Fehler &quot;undefined reference to 'Foo::bar(float*)'&quot;.<br />
Wenn ich die implementierung in die .h-Datei schreibe geht's natürlich.</p>
<p>Ich dachte, sobald man den Compiler zum expliziten instantiieren zwingt (was ich <a href="http://m.Mn" rel="nofollow">m.Mn</a>. in den letzten zwei Zeilen von .h tue), würde das nicht auftreten.</p>
<p>Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/277092/gelöst-linkerfehler-bei-template-member-funktion-obwohl-explizit-instantiiert</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 04:23:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/277092.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 12 Nov 2010 21:23:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [gelöst] Linkerfehler bei template member-Funktion, obwohl explizit instantiiert on Fri, 12 Nov 2010 21:46:36 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Klasse mit einer Template-Memberfunktion. Alle instantiierungen sind vorher schon bekannt. Ich möchte die Funktion ungern im .h-File inlinen, sondern im .cpp file stehen lassen.</p>
<p>Damit das gut geht, muss ich den Compiler ja zwingen, sie einmal explizit zu instantiieren, für alle Paramter die auftreten werden.</p>
<p>Trotzdem erhalte ich beim linken der Applikation einen Linkerfehler.</p>
<p>Die .h-Datei:</p>
<pre><code class="language-cpp">class Foo {
public:
    template &lt;typename T&gt;
    void bar (T* t);
};

template void Foo::bar&lt;int&gt;(int* t);
template void Foo::bar&lt;float&gt;(float* t);
</code></pre>
<p>die .cpp-Datei:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
void Foo::bar(T* t)
{
    frobnicate(t);
}
</code></pre>
<p>Beim Linken erhalte ich dann den Fehler &quot;undefined reference to 'Foo::bar(float*)'&quot;.<br />
Wenn ich die implementierung in die .h-Datei schreibe geht's natürlich.</p>
<p>Ich dachte, sobald man den Compiler zum expliziten instantiieren zwingt (was ich <a href="http://m.Mn" rel="nofollow">m.Mn</a>. in den letzten zwei Zeilen von .h tue), würde das nicht auftreten.</p>
<p>Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979699</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979699</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Fri, 12 Nov 2010 21:46:36 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Linkerfehler bei template member-Funktion, obwohl explizit instantiiert on Fri, 12 Nov 2010 21:32:19 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template void Foo::bar&lt;int&gt;(int* t);
template void Foo::bar&lt;float&gt;(float* t);
</code></pre>
<p>Das muss in die cpp-Datei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979704</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979704</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 12 Nov 2010 21:32:19 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Linkerfehler bei template member-Funktion, obwohl explizit instantiiert on Fri, 12 Nov 2010 21:38:06 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template void Foo::bar&lt;int&gt;(int* t);
template void Foo::bar&lt;float&gt;(float* t);
</code></pre>
<p>Das muss in die cpp-Datei.</p>
</blockquote>
<p>Gleiches Ergebnis. Linker mault trotzdem.</p>
<p>Kompiler ist übrigens gcc 4.5.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979708</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979708</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Fri, 12 Nov 2010 21:38:06 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Linkerfehler bei template member-Funktion, obwohl explizit instantiiert on Fri, 12 Nov 2010 21:43:45 GMT]]></title><description><![CDATA[<p>PhilippM schrieb:</p>
<blockquote>
<p>Gleiches Ergebnis. Linker mault trotzdem.</p>
<p>Kompiler ist übrigens gcc 4.5.</p>
</blockquote>
<p>Das sollte nicht so sein. Was tust du denn genau? Hier Schritt für Schritt Anleitung (getestet mit gcc 4.4):</p>
<p>foo.h:</p>
<pre><code class="language-cpp">class Foo {
public:
    template &lt;typename T&gt;
    void bar (T* t);
};
</code></pre>
<p><a href="http://foo.cc" rel="nofollow">foo.cc</a>:</p>
<pre><code class="language-cpp">#include&quot;foo.h&quot;

template &lt;typename T&gt;
void Foo::bar(T* t)
{
  // Dein Code
} 

template void Foo::bar&lt;int&gt;(int* t);
template void Foo::bar&lt;float&gt;(float* t);
</code></pre>
<p><a href="http://main.cc" rel="nofollow">main.cc</a>:</p>
<pre><code class="language-cpp">#include &quot;foo.h&quot;

int main()
{
  Foo foo;
  int *a;
  foo.bar&lt;int&gt;(a);
}
</code></pre>
<p>Compilierbar auf alle gängigen Arten und Weisen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979711</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979711</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 12 Nov 2010 21:43:45 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Linkerfehler bei template member-Funktion, obwohl explizit instantiiert on Fri, 12 Nov 2010 21:47:55 GMT]]></title><description><![CDATA[<p>Disregard all after good morning.</p>
<p>Klarer Fall von Facepalm: ich habe nicht das Projekt rekompiliert, das ich dachte das ich rekompiliert habe.<br />
Es geht natürlich so.</p>
<p>Vielen Dank für die Hilfe, Thread kann geschlossen werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979715</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Fri, 12 Nov 2010 21:47:55 GMT</pubDate></item></channel></rss>