<?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[undefined reference bei templates]]></title><description><![CDATA[<p>Hey,</p>
<p>ich bin mir nicht sicher ob es mein Fehler ist oder der meines Compilers (g++ 4.2.1). Ich habe folgende Header-Datei (Ausschnitt):</p>
<pre><code class="language-cpp">template&lt;typename id_type, int ID_LEN, int STR_MAX, int SHIFT_SIZE&gt;
unsigned int get_db_id(const char* search_name, const char* db_file);

inline unsigned int get_pilot_id(const char* search_name) {
	return get_db_id&lt;unsigned int, 4, 28, 5&gt;(search_name, &quot;pilots.dat&quot;); // l. 30
}

inline unsigned int get_mod_id(const char* search_name) {
	return get_db_id&lt;unsigned short, 2, 30, 5&gt;(search_name, &quot;mods.dat&quot;); // l. 34
}

inline unsigned int get_mission_id(const char* search_name) {
	return get_db_id&lt;unsigned int, 4, 60, 5&gt;(search_name, &quot;missions.dat&quot;);
}

inline unsigned int get_server_id(const char* search_name) {
	return get_db_id&lt;unsigned short, 2, 30, 5&gt;(search_name, &quot;servers.dat&quot;);
}
</code></pre>
<p>Dabei ist die obere Funktion in einer CPP-Datei, die diese Datei includet, implementiert. Der Compiler compiliert zunächst, spuckt aber beim Linken dann Errors aus:</p>
<pre><code>./main.o: In function `get_mod_id':
/home/johannes/cprogs/stats_project/stats_reader/./db.h:34: undefined reference to `unsigned int get_db_id&lt;unsigned short, 2, 30, 5&gt;(char const*, char const*)'
./main.o: In function `get_pilot_id':
/home/johannes/cprogs/stats_project/stats_reader/./db.h:30: undefined reference to `unsigned int get_db_id&lt;unsigned int, 4, 28, 5&gt;(char const*, char const*)'
/home/johannes/cprogs/stats_project/stats_reader/./db.h:30: undefined reference to `unsigned int get_db_id&lt;unsigned int, 4, 28, 5&gt;(char const*, char const*)'
collect2: ld returned 1 exit status
</code></pre>
<p>Ich verstehe nicht<br />
- wo mein Fehler ist<br />
- warum er es nur bei den OBERSTEN ZWEI template-funktion-aufrufen meckert, bei den unteren zwei dagegen nicht. Wenn ich Zeile 30 und 34 auskommentiere, übersetzt er die Datei obskurer Weise <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
- warum er den Fehler in Zeile 30 gleich ZWEI mal vermerkt, den aus 34 nur einmal</p>
<p>Auf Support freut sich<br />
voidpointer <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>PS.: Bin nun einen Schritt weiter! Der zweite Punkt könnte daher kommen, dass die Funktionen in Zeile 30 und 34 tatsächlich von der main.cpp aufgerufen werden, die anderen eiden sind noch unbenutzt</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/216659/undefined-reference-bei-templates</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 06:53:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/216659.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 26 Jun 2008 14:39:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to undefined reference bei templates on Thu, 26 Jun 2008 15:03:08 GMT]]></title><description><![CDATA[<p>Hey,</p>
<p>ich bin mir nicht sicher ob es mein Fehler ist oder der meines Compilers (g++ 4.2.1). Ich habe folgende Header-Datei (Ausschnitt):</p>
<pre><code class="language-cpp">template&lt;typename id_type, int ID_LEN, int STR_MAX, int SHIFT_SIZE&gt;
unsigned int get_db_id(const char* search_name, const char* db_file);

inline unsigned int get_pilot_id(const char* search_name) {
	return get_db_id&lt;unsigned int, 4, 28, 5&gt;(search_name, &quot;pilots.dat&quot;); // l. 30
}

inline unsigned int get_mod_id(const char* search_name) {
	return get_db_id&lt;unsigned short, 2, 30, 5&gt;(search_name, &quot;mods.dat&quot;); // l. 34
}

inline unsigned int get_mission_id(const char* search_name) {
	return get_db_id&lt;unsigned int, 4, 60, 5&gt;(search_name, &quot;missions.dat&quot;);
}

inline unsigned int get_server_id(const char* search_name) {
	return get_db_id&lt;unsigned short, 2, 30, 5&gt;(search_name, &quot;servers.dat&quot;);
}
</code></pre>
<p>Dabei ist die obere Funktion in einer CPP-Datei, die diese Datei includet, implementiert. Der Compiler compiliert zunächst, spuckt aber beim Linken dann Errors aus:</p>
<pre><code>./main.o: In function `get_mod_id':
/home/johannes/cprogs/stats_project/stats_reader/./db.h:34: undefined reference to `unsigned int get_db_id&lt;unsigned short, 2, 30, 5&gt;(char const*, char const*)'
./main.o: In function `get_pilot_id':
/home/johannes/cprogs/stats_project/stats_reader/./db.h:30: undefined reference to `unsigned int get_db_id&lt;unsigned int, 4, 28, 5&gt;(char const*, char const*)'
/home/johannes/cprogs/stats_project/stats_reader/./db.h:30: undefined reference to `unsigned int get_db_id&lt;unsigned int, 4, 28, 5&gt;(char const*, char const*)'
collect2: ld returned 1 exit status
</code></pre>
<p>Ich verstehe nicht<br />
- wo mein Fehler ist<br />
- warum er es nur bei den OBERSTEN ZWEI template-funktion-aufrufen meckert, bei den unteren zwei dagegen nicht. Wenn ich Zeile 30 und 34 auskommentiere, übersetzt er die Datei obskurer Weise <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
- warum er den Fehler in Zeile 30 gleich ZWEI mal vermerkt, den aus 34 nur einmal</p>
<p>Auf Support freut sich<br />
voidpointer <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>PS.: Bin nun einen Schritt weiter! Der zweite Punkt könnte daher kommen, dass die Funktionen in Zeile 30 und 34 tatsächlich von der main.cpp aufgerufen werden, die anderen eiden sind noch unbenutzt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536437</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536437</guid><dc:creator><![CDATA[voidpointer]]></dc:creator><pubDate>Thu, 26 Jun 2008 15:03:08 GMT</pubDate></item><item><title><![CDATA[Reply to undefined reference bei templates on Thu, 26 Jun 2008 15:01:02 GMT]]></title><description><![CDATA[<p>Wo ist den die Implementierung von dem?</p>
<pre><code class="language-cpp">template&lt;typename id_type, int ID_LEN, int STR_MAX, int SHIFT_SIZE&gt;
unsigned int get_db_id(const char* search_name, const char* db_file);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1536447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536447</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 26 Jun 2008 15:01:02 GMT</pubDate></item><item><title><![CDATA[Reply to undefined reference bei templates on Thu, 26 Jun 2008 15:06:04 GMT]]></title><description><![CDATA[<p>&quot;Dabei ist die obere Funktion in einer CPP-Datei, die diese Datei includet, implementiert. &quot; -&gt; Damit meinte ich diese Funktion</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536452</guid><dc:creator><![CDATA[voidpointer]]></dc:creator><pubDate>Thu, 26 Jun 2008 15:06:04 GMT</pubDate></item><item><title><![CDATA[Reply to undefined reference bei templates on Thu, 26 Jun 2008 15:22:49 GMT]]></title><description><![CDATA[<p>voidpointer schrieb:</p>
<blockquote>
<p>&quot;Dabei ist die obere Funktion in einer CPP-Datei, die diese Datei includet, implementiert. &quot; -&gt; Damit meinte ich diese Funktion</p>
</blockquote>
<p>Templates müssen immer vollständig definiert sein (Sprich: Definition bei Templates bitte in den Header packen).</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536468</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 26 Jun 2008 15:22:49 GMT</pubDate></item><item><title><![CDATA[Reply to undefined reference bei templates on Thu, 26 Jun 2008 15:36:09 GMT]]></title><description><![CDATA[<p>was fehlt denn an meiner definition im header noch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536477</guid><dc:creator><![CDATA[voidpointer]]></dc:creator><pubDate>Thu, 26 Jun 2008 15:36:09 GMT</pubDate></item><item><title><![CDATA[Reply to undefined reference bei templates on Thu, 26 Jun 2008 15:45:14 GMT]]></title><description><![CDATA[<p>Die definition der template-Funktion fehlt im Header noch. Da steht nur eine Deklaration.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536485</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536485</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 26 Jun 2008 15:45:14 GMT</pubDate></item><item><title><![CDATA[Reply to undefined reference bei templates on Thu, 26 Jun 2008 15:52:25 GMT]]></title><description><![CDATA[<p>Grundsätzlich ist es üblich Templates komplett im Header zu halten (und keine .cpp) anzulegen.</p>
<p>Ich nenne mal die mir bekannten zwei Alternativen:<br />
a) Man schreibt die Definition in eine eigene Datei (nennt sie dann aber möglichst nicht .cpp sondern z.B. .tmpl) und includiert diese am Ende des Headers. Dabei ist aber zu Beachten das alles was für Header gilt, auch für diese Datei gilt (z.B. sollte man dort kein using namespace verwenden).</p>
<p>b) Das Schlüsselwort export im Zusammenhang mit Templates. Da es bisher aber nur von einem oder zwei Compilern (mir ist jetzt nur der Comeau bekannt) unterstützt wird, ist diese Lösung eher nicht sinnvoll.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536491</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 26 Jun 2008 15:52:25 GMT</pubDate></item><item><title><![CDATA[Reply to undefined reference bei templates on Thu, 26 Jun 2008 17:12:03 GMT]]></title><description><![CDATA[<p>Ah ok die Definition könnte ich schon in die header-datei tun. aber das soll man doch eigentlich nicht machen, oder? Hatte mal einen älteren g++ (3.0 oder so), der Header-Dateien mit Definitionen nicht kompilieren wollte (wegen multiple declaration oder so).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536545</guid><dc:creator><![CDATA[voidpointer]]></dc:creator><pubDate>Thu, 26 Jun 2008 17:12:03 GMT</pubDate></item><item><title><![CDATA[Reply to undefined reference bei templates on Thu, 26 Jun 2008 17:38:32 GMT]]></title><description><![CDATA[<p>voidpointer schrieb:</p>
<blockquote>
<p>Ah ok die Definition könnte ich schon in die header-datei tun. aber das soll man doch eigentlich nicht machen, oder? Hatte mal einen älteren g++ (3.0 oder so), der Header-Dateien mit Definitionen nicht kompilieren wollte (wegen multiple declaration oder so).</p>
</blockquote>
<p>Doch. Das ist eigentlich üblich die im Header zu schreiben. Ältere Compiler hatten mit Templates Probleme. Das haben sie Heute eigl. nicht mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536554</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 26 Jun 2008 17:38:32 GMT</pubDate></item><item><title><![CDATA[Reply to undefined reference bei templates on Fri, 27 Jun 2008 07:01:46 GMT]]></title><description><![CDATA[<p>voidpointer schrieb:</p>
<blockquote>
<p>Ah ok die Definition könnte ich schon in die header-datei tun. aber das soll man doch eigentlich nicht machen, oder? Hatte mal einen älteren g++ (3.0 oder so), der Header-Dateien mit Definitionen nicht kompilieren wollte (wegen multiple declaration oder so).</p>
</blockquote>
<p>Das stimmt zwar einerseits und andererseits auch nicht.<br />
- Für &quot;normale Funktionen&quot; stimmt das (=&gt; Implementation auslagern)<br />
- Für templates ist es genau anders herum (=&gt; Implementation mit in den Header)</p>
<p>Das liegt an den speziellen Eigenschaften der templates (es sind eben keine Funktionen, sondern die Funktionen werden erst vom Compiler erzeugt).</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536736</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536736</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 27 Jun 2008 07:01:46 GMT</pubDate></item><item><title><![CDATA[Reply to undefined reference bei templates on Fri, 27 Jun 2008 10:14:47 GMT]]></title><description><![CDATA[<p>ah ok danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536880</guid><dc:creator><![CDATA[voidpointer]]></dc:creator><pubDate>Fri, 27 Jun 2008 10:14:47 GMT</pubDate></item></channel></rss>