<?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 funktionstemplate in (nicht template) klasse]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich hab hier ein kleines Problemchen, und leider keine Ahnung worans liegt. Meiner meinung nach hab ich alles richtig deklariert.</p>
<p>Also, ich hab ne Klasse, die keine Templateklasse ist. Diese hat eine Memberfunktion die ein Template ist.<br />
Diese Klasse ist in einer Datei, nennen wir sie foo.cpp und foo.h .<br />
Dann hab ich noch ne main.cpp, aus der das template aufgerufen wird.</p>
<p>Wenn ich beide dateien kompiliere, gibts keine Fehler.<br />
Nur beim linken krieg ich nen fehler, dass das (jetzt spezialisierte) template nicht gefunden werden kann.</p>
<p>Also hier sind die Dateien (möglichst aufs problem reduziert)</p>
<p>foo.h:</p>
<pre><code class="language-cpp">#ifndef FOO_H
#define FOO_H

class maxclass
{

public:

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

};

#endif // FOO_H
</code></pre>
<p>foo.cpp:</p>
<pre><code class="language-cpp">#include &quot;foo.h&quot;

template &lt;typename T&gt;	
T maxclass::my_max(T a, T b)
{

	if (a &gt; b)
		return a;

}
</code></pre>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

#include &quot;foo.h&quot;

int main()
{
	int a= 4, b= 2, c;

	maxclass mc;

	c = mc.my_max(a, b);

	std::cout&lt;&lt;&quot;c = &quot;&lt;&lt;c&lt;&lt;'\n';

	return 0;
}
</code></pre>
<p>Mein Compiler: gcc 4.1</p>
<p>Das hier ist die linker fehlermeldung:<br />
(zuerst beide .cpp in .o kompiliert, fehlerfrei)</p>
<p>g++ -o blub main.o foo.o schrieb:</p>
<blockquote>
<p>main.o: In function <code>main': main.cpp:(.text+0xa6): undefined reference to</code>int maxclass::my_max&lt;int&gt;(int, int)'<br />
collect2: ld returned 1 exit status</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/topic/189844/undefined-reference-bei-funktionstemplate-in-nicht-template-klasse</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 11:08:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/189844.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 17 Aug 2007 14:09:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to undefined reference bei funktionstemplate in (nicht template) klasse on Fri, 17 Aug 2007 14:09:05 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich hab hier ein kleines Problemchen, und leider keine Ahnung worans liegt. Meiner meinung nach hab ich alles richtig deklariert.</p>
<p>Also, ich hab ne Klasse, die keine Templateklasse ist. Diese hat eine Memberfunktion die ein Template ist.<br />
Diese Klasse ist in einer Datei, nennen wir sie foo.cpp und foo.h .<br />
Dann hab ich noch ne main.cpp, aus der das template aufgerufen wird.</p>
<p>Wenn ich beide dateien kompiliere, gibts keine Fehler.<br />
Nur beim linken krieg ich nen fehler, dass das (jetzt spezialisierte) template nicht gefunden werden kann.</p>
<p>Also hier sind die Dateien (möglichst aufs problem reduziert)</p>
<p>foo.h:</p>
<pre><code class="language-cpp">#ifndef FOO_H
#define FOO_H

class maxclass
{

public:

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

};

#endif // FOO_H
</code></pre>
<p>foo.cpp:</p>
<pre><code class="language-cpp">#include &quot;foo.h&quot;

template &lt;typename T&gt;	
T maxclass::my_max(T a, T b)
{

	if (a &gt; b)
		return a;

}
</code></pre>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

#include &quot;foo.h&quot;

int main()
{
	int a= 4, b= 2, c;

	maxclass mc;

	c = mc.my_max(a, b);

	std::cout&lt;&lt;&quot;c = &quot;&lt;&lt;c&lt;&lt;'\n';

	return 0;
}
</code></pre>
<p>Mein Compiler: gcc 4.1</p>
<p>Das hier ist die linker fehlermeldung:<br />
(zuerst beide .cpp in .o kompiliert, fehlerfrei)</p>
<p>g++ -o blub main.o foo.o schrieb:</p>
<blockquote>
<p>main.o: In function <code>main': main.cpp:(.text+0xa6): undefined reference to</code>int maxclass::my_max&lt;int&gt;(int, int)'<br />
collect2: ld returned 1 exit status</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1346415</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346415</guid><dc:creator><![CDATA[DrPhil_Guth]]></dc:creator><pubDate>Fri, 17 Aug 2007 14:09:05 GMT</pubDate></item><item><title><![CDATA[Reply to undefined reference bei funktionstemplate in (nicht template) klasse on Fri, 17 Aug 2007 14:14:09 GMT]]></title><description><![CDATA[<p>Bei Templates muss die Implementation in der Header erfolgen.</p>
<pre><code class="language-cpp">#ifndef FOO_H
#define FOO_H

class maxclass
{

public:

    template &lt;typename T&gt;   
    T maxclass::my_max(T a, T b)
    {
        if (a &gt; b)
            return a;
    }

};

#endif // FOO_H
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1346418</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346418</guid><dc:creator><![CDATA[Airdamn]]></dc:creator><pubDate>Fri, 17 Aug 2007 14:14:09 GMT</pubDate></item><item><title><![CDATA[Reply to undefined reference bei funktionstemplate in (nicht template) klasse on Fri, 17 Aug 2007 14:18:11 GMT]]></title><description><![CDATA[<p>Echt jetzt? Nur inline?</p>
<p>Das ist aber blöd...</p>
<p>Die richtige Template ist aber um einiges Länger und ich hätt das wirklich gern in der implementierungsdatei mit den anderen membern. Gibts da keinen weg drumherum?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346422</guid><dc:creator><![CDATA[DrPhil_Guth]]></dc:creator><pubDate>Fri, 17 Aug 2007 14:18:11 GMT</pubDate></item><item><title><![CDATA[Reply to undefined reference bei funktionstemplate in (nicht template) klasse on Fri, 17 Aug 2007 14:21:58 GMT]]></title><description><![CDATA[<p>Du kannst die Datei, in die du die implentierungen schreibst, einfach in die Header-Datei includen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346427</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346427</guid><dc:creator><![CDATA[The-Kenny]]></dc:creator><pubDate>Fri, 17 Aug 2007 14:21:58 GMT</pubDate></item><item><title><![CDATA[Reply to undefined reference bei funktionstemplate in (nicht template) klasse on Fri, 17 Aug 2007 14:23:50 GMT]]></title><description><![CDATA[<p>in die cpp geht nicht, weil die Templates zur Compilezeit bekannt sein müssen.<br />
Du kannst die Implementation der Template-Member in eine andere Datei auslagern, siehe <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-189754.html" rel="nofollow">hier</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346430</guid><dc:creator><![CDATA[Airdamn]]></dc:creator><pubDate>Fri, 17 Aug 2007 14:23:50 GMT</pubDate></item><item><title><![CDATA[Reply to undefined reference bei funktionstemplate in (nicht template) klasse on Fri, 17 Aug 2007 14:25:28 GMT]]></title><description><![CDATA[<p>DrPhil_Guth schrieb:</p>
<blockquote>
<p>Gibts da keinen weg drumherum?</p>
</blockquote>
<p>Wenn du weißt, welche Instanzen deines Templates du brauchst, kannst du diese per expliziter Instantiierung in foo.cpp erzeugen. Oder du nimmst einen Compiler, der export unterstützt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346432</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346432</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 17 Aug 2007 14:25:28 GMT</pubDate></item><item><title><![CDATA[Reply to undefined reference bei funktionstemplate in (nicht template) klasse on Fri, 17 Aug 2007 14:31:11 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Wenn du weißt, welche Instanzen deines Templates du brauchst, kannst du diese per expliziter Instantiierung in foo.cpp erzeugen. Oder du nimmst einen Compiler, der export unterstützt.</p>
</blockquote>
<p>Das weiß ich leider nicht. Der Templateparameter wird nämlich an operator&gt;&gt; von stringstream weitergereicht, und ich will nichts einschränken, was den Benutzern meiner Klasse mit stringstreams so alles einfällt.</p>
<p>Also werd ich wohl das ding mit der extradeitei nehmen müssen. Ist zwar auch nicht das wahre (es sollte eine kleine Klassenhirarchie zum Lesen von konfigurationsdateien werden, aber ich hab jetzt schon 2 * (.cpp + .h) <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> ) aber wenn die anderen möglichkeiten alle so lau sind...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346434</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346434</guid><dc:creator><![CDATA[DrPhil_Guth]]></dc:creator><pubDate>Fri, 17 Aug 2007 14:31:11 GMT</pubDate></item><item><title><![CDATA[Reply to undefined reference bei funktionstemplate in (nicht template) klasse on Fri, 17 Aug 2007 14:50:25 GMT]]></title><description><![CDATA[<p>zum einen</p>
<pre><code class="language-cpp">maxclass::
</code></pre>
<p>gehört nicht in die Deklaration der maxclass-Klasse (der ICC wirft da brav warnigs)<br />
zum anderen kannst du die Funktion ausserhalb der Deklaration definieren:</p>
<pre><code class="language-cpp">#ifndef FOO_H 
#define FOO_H 

class maxclass 
{ 
public: 
   template &lt;typename T&gt;   
   T my_max(const T&amp; a, const T&amp; b); 
}; 

template &lt;typename T&gt;   
T maxclass::my_max(const T&amp; a, const T&amp; b) 
{ 
   if (a &gt; b) return a; 
   return b;
} 
#endif // FOO_H
</code></pre>
<p>und bei Lust und Laune (z.B. aus Gründen der Übersichltichkeit) kannst du die Definitionen auf in eine .hpp, .impl Datei packen, die du dann dennoch nach der Deklaration im HEader einfügen musst. Ausser du hast einen Kompiler, der export untersützt, aber die Anzahl ist mehr als überschaubar.</p>
<p>und was die lauen möglichkeiten anbelangt, so denk immer dran, was für eine schreibarbeit dir so ein template letztlich spart <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="😉"
    /> zudem verstehe ich nicht wieso die datei-zahl steigen sollte? wenn du alles im header hast, dann hast du sogar ne cpp, weniger. okay, die übersicht geht evtl irgendwann flöten und die compilierzeit steigt bei templates...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346447</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Fri, 17 Aug 2007 14:50:25 GMT</pubDate></item></channel></rss>