<?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[Templates und Linker-Probleme]]></title><description><![CDATA[<p>Für ein Projekt habe mich mal intensiver mit Templates beschäftig und bin auf einige Fragen gestoßen.</p>
<p>Ich habe eine Klasse IOData:</p>
<p>IOData.h:</p>
<pre><code>#pragma once

#include &lt;array&gt;

template&lt;std::size_t Size&gt;
class IOData
{
public:
	IOData(void);
	~IOData(void);

	double&amp; operator[](unsigned Index);
	IOData&lt;Size&gt; operator=(IOData&lt;Size&gt; Right);

private:
	std::tr1::array&lt;double, Size&gt; m_Array;
};
</code></pre>
<p>IOData.cpp:</p>
<pre><code>#include &quot;IOData.h&quot;

template&lt;std::size_t Size&gt;
IOData&lt;Size&gt;::IOData(void)
{
}

template&lt;std::size_t Size&gt;
IOData&lt;Size&gt;::~IOData(void)

{
}

template&lt;std::size_t Size&gt;
double&amp; IOData&lt;Size&gt;::operator[](unsigned Index)
{
	return m_Array.at(Index);
}

template&lt;std::size_t Size&gt;
IOData&lt;Size&gt; IOData&lt;Size&gt;::operator=(IOData&lt;Size&gt; Right)
{
	m_Array = Right.m_Array;
	return (*this);
}

//Allgemeine binäre Operatoren
template&lt;std::size_t Size&gt;
IOData&lt;Size&gt; operator+(IOData&lt;Size&gt; Left, IOData&lt;Size&gt; Right)
{
	IOData&lt;Size&gt; rtn = {0};
	for(unsigned i = 0; i &lt; Size; i++)
		rtn[i] = Left[i]+Right[i];
	return rtn;
}

template&lt;std::size_t Size&gt;
IOData&lt;Size&gt; operator-(IOData&lt;Size&gt; Left, IOData&lt;Size&gt; Right)
{
	IOData&lt;Size&gt; rtn = {0};
	for(unsigned i = 0; i &lt; Size; i++)
		rtn[i] = Left[i]-Right[i];
	return rtn;
}

template IOData&lt;26&gt;; //&lt;----- HIERUM GEHT ES
</code></pre>
<p>main.cpp:</p>
<pre><code>...
IOData&lt;26&gt; RelativeHaeufigkeit(ifstream* Datei)
{
	IOData&lt;26&gt; rtn;
	char a = 0;
	long count = 0;
	while(!Datei-&gt;eof()){
		a = Datei-&gt;get();
		if(a &gt;= 97 &amp;&amp; a &lt;= 122)
			rtn[a-97]++;
		count++;
	}
	for(unsigned i = 0; i &lt; 26; i++)
		rtn[i] = rtn[i] / count;

	return rtn;
}
...
</code></pre>
<p>Warum muss ich in der IOData.cpp unten noch ein &quot;template IOData&lt;26&gt;;&quot; einfügen. Ansonsten gibt es nämlich Linker Errors.<br />
Es kann ja nicht sein, das ich jede spezielle Arraygröße erst bekannt machen muss.</p>
<p>Oder missbrauche ich templates gerade für etwas, wofür es nicht gemacht ist?</p>
<p>MFG<br />
Ace</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/271153/templates-und-linker-probleme</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 16:48:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/271153.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 23 Jul 2010 14:59:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Templates und Linker-Probleme on Fri, 23 Jul 2010 14:59:05 GMT]]></title><description><![CDATA[<p>Für ein Projekt habe mich mal intensiver mit Templates beschäftig und bin auf einige Fragen gestoßen.</p>
<p>Ich habe eine Klasse IOData:</p>
<p>IOData.h:</p>
<pre><code>#pragma once

#include &lt;array&gt;

template&lt;std::size_t Size&gt;
class IOData
{
public:
	IOData(void);
	~IOData(void);

	double&amp; operator[](unsigned Index);
	IOData&lt;Size&gt; operator=(IOData&lt;Size&gt; Right);

private:
	std::tr1::array&lt;double, Size&gt; m_Array;
};
</code></pre>
<p>IOData.cpp:</p>
<pre><code>#include &quot;IOData.h&quot;

template&lt;std::size_t Size&gt;
IOData&lt;Size&gt;::IOData(void)
{
}

template&lt;std::size_t Size&gt;
IOData&lt;Size&gt;::~IOData(void)

{
}

template&lt;std::size_t Size&gt;
double&amp; IOData&lt;Size&gt;::operator[](unsigned Index)
{
	return m_Array.at(Index);
}

template&lt;std::size_t Size&gt;
IOData&lt;Size&gt; IOData&lt;Size&gt;::operator=(IOData&lt;Size&gt; Right)
{
	m_Array = Right.m_Array;
	return (*this);
}

//Allgemeine binäre Operatoren
template&lt;std::size_t Size&gt;
IOData&lt;Size&gt; operator+(IOData&lt;Size&gt; Left, IOData&lt;Size&gt; Right)
{
	IOData&lt;Size&gt; rtn = {0};
	for(unsigned i = 0; i &lt; Size; i++)
		rtn[i] = Left[i]+Right[i];
	return rtn;
}

template&lt;std::size_t Size&gt;
IOData&lt;Size&gt; operator-(IOData&lt;Size&gt; Left, IOData&lt;Size&gt; Right)
{
	IOData&lt;Size&gt; rtn = {0};
	for(unsigned i = 0; i &lt; Size; i++)
		rtn[i] = Left[i]-Right[i];
	return rtn;
}

template IOData&lt;26&gt;; //&lt;----- HIERUM GEHT ES
</code></pre>
<p>main.cpp:</p>
<pre><code>...
IOData&lt;26&gt; RelativeHaeufigkeit(ifstream* Datei)
{
	IOData&lt;26&gt; rtn;
	char a = 0;
	long count = 0;
	while(!Datei-&gt;eof()){
		a = Datei-&gt;get();
		if(a &gt;= 97 &amp;&amp; a &lt;= 122)
			rtn[a-97]++;
		count++;
	}
	for(unsigned i = 0; i &lt; 26; i++)
		rtn[i] = rtn[i] / count;

	return rtn;
}
...
</code></pre>
<p>Warum muss ich in der IOData.cpp unten noch ein &quot;template IOData&lt;26&gt;;&quot; einfügen. Ansonsten gibt es nämlich Linker Errors.<br />
Es kann ja nicht sein, das ich jede spezielle Arraygröße erst bekannt machen muss.</p>
<p>Oder missbrauche ich templates gerade für etwas, wofür es nicht gemacht ist?</p>
<p>MFG<br />
Ace</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930758</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930758</guid><dc:creator><![CDATA[AceKiller73]]></dc:creator><pubDate>Fri, 23 Jul 2010 14:59:05 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und Linker-Probleme on Fri, 23 Jul 2010 15:09:25 GMT]]></title><description><![CDATA[<p>(ohne den code gelesen zu haben)</p>
<p>templates kann man nicht in *.h und *.cpp aufteilen.<br />
muss alles in der selben datei stehen.<br />
bzw du nennst die source-datei in *.inl oder *.impl um und includest sie am ende des headers. aber anders geht es mit templates nicht</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930761</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 23 Jul 2010 15:09:25 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und Linker-Probleme on Fri, 23 Jul 2010 15:10:24 GMT]]></title><description><![CDATA[<p>in folgendem Teil in der FAQ stehts (dritter Punkt):</p>
<p><a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-246875.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-246875.html</a></p>
<p>PS: das nächstemal am Besten gleich die Linkerfehler mit angeben <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/1930762</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930762</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 23 Jul 2010 15:10:24 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und Linker-Probleme on Fri, 23 Jul 2010 15:23:29 GMT]]></title><description><![CDATA[<p>Hmm ok.<br />
Alles klar.<br />
Viele Dank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930768</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930768</guid><dc:creator><![CDATA[AceKiller73]]></dc:creator><pubDate>Fri, 23 Jul 2010 15:23:29 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und Linker-Probleme on Sat, 24 Jul 2010 14:29:47 GMT]]></title><description><![CDATA[<p>Hab wieder ein Problem mit selbiger Klasse:<br />
Diesmal wollte ich den &lt;&lt; operator für cout definieren, bekomme aber wieder einen Linker Fehler.</p>
<p>iodata.hpp</p>
<pre><code>#pragma once

#include &lt;array&gt;
#include &lt;iostream&gt;

template&lt;std::size_t Size&gt;
class IOData
{
public:
	IOData(void);
	~IOData(void);

	double&amp; operator[](unsigned Index);
	IOData&lt;Size&gt; operator=(IOData&lt;Size&gt; Right);

	friend std::ostream&amp; operator&lt;&lt;(std::ostream&amp; ostr, IOData&lt;Size&gt; &amp;m);

private:
	std::tr1::array&lt;double, Size&gt; m_Array;
};

[...]

//HIERUM GEHTS
template&lt;std::size_t Size&gt;
std::ostream&amp; operator&lt;&lt;(std::ostream&amp; ostr,  IOData&lt;Size&gt; &amp;m) 
{
	for(unsigned i = 0; i &lt; Size; i++)
		ostr &lt;&lt; m.m_Array[i] &lt;&lt; &quot; &quot;; 

	return ostr;
}
</code></pre>
<p>main.cpp</p>
<pre><code>#include &lt;iostream&gt;
#include &quot;iodata.hpp&quot;

using namespace std;

int main()
{
	IOData&lt;5&gt; var;
	for(unsigned i = 0; i &lt; 5; i++)
		var[i] = i;

	cout &lt;&lt; var;
	return 1;
}
</code></pre>
<p>Error</p>
<pre><code>1&gt;------ Erstellen gestartet: Projekt: test, Konfiguration: Debug Win32 ------
1&gt;  main.cpp
1&gt;main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol &quot;&quot;class std::basic_ostream&lt;char,struct std::char_traits&lt;char&gt; &gt; &amp; __cdecl operator&lt;&lt;(class std::basic_ostream&lt;char,struct std::char_traits&lt;char&gt; &gt; &amp;,class IOData&lt;5&gt; &amp;)&quot; (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$IOData@$04@@@Z)&quot; in Funktion &quot;_main&quot;.
1&gt;c:...\test.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
</code></pre>
<p>Diesmal hab ich die Klasse ja in einer Datei... Wo ist der Fehler?<br />
MFG<br />
Ace</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1931057</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1931057</guid><dc:creator><![CDATA[AceKiller73]]></dc:creator><pubDate>Sat, 24 Jul 2010 14:29:47 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und Linker-Probleme on Sat, 24 Jul 2010 14:33:52 GMT]]></title><description><![CDATA[<p>...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1931059</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1931059</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 24 Jul 2010 14:33:52 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und Linker-Probleme on Sat, 24 Jul 2010 14:34:41 GMT]]></title><description><![CDATA[<p>Du deklarierst eine Funktion (die friend-Deklaration in der Klasse) aber definierst sie nirgendswo. Diese Deklaration ist nämlich nicht kompatibel zu dem Template darunter. Das sind zwei verschiedene Dinge.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1931060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1931060</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 24 Jul 2010 14:34:41 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und Linker-Probleme on Sat, 24 Jul 2010 16:09:47 GMT]]></title><description><![CDATA[<p>D.h. ich <strong>muss</strong> die Funktion in der Klassedeklaration definieren?</p>
<p>So gehts schonmal:</p>
<pre><code>class IOData
{
public:
	IOData(void);
	~IOData(void);

	double&amp; operator[](unsigned Index);
	IOData&lt;Size&gt; operator=(IOData&lt;Size&gt; Right);

	friend std::ostream&amp; operator&lt;&lt;(std::ostream&amp; ostr, IOData&lt;Size&gt; &amp;m)
	{
		for(unsigned i = 0; i &lt; Size; i++)
			ostr &lt;&lt; m.m_Array[i] &lt;&lt; &quot; &quot;; 

		return ostr;
	}

private:
	std::tr1::array&lt;double, Size&gt; m_Array;
};
</code></pre>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1931081</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1931081</guid><dc:creator><![CDATA[AceKiller73]]></dc:creator><pubDate>Sat, 24 Jul 2010 16:09:47 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und Linker-Probleme on Sat, 24 Jul 2010 16:42:25 GMT]]></title><description><![CDATA[<p>AceKiller73 schrieb:</p>
<blockquote>
<p>D.h. ich <strong>muss</strong> die Funktion in der Klassedeklaration definieren?</p>
</blockquote>
<p>Nö. Das heißt nur, dass Deine friend-Deklaration nicht zum Template passte.<br />
<a href="http://www.parashift.com/c++-faq-lite/templates.html#faq-35.16" rel="nofollow">http://www.parashift.com/c++-faq-lite/templates.html#faq-35.16</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1931092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1931092</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 24 Jul 2010 16:42:25 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und Linker-Probleme on Sat, 24 Jul 2010 18:44:13 GMT]]></title><description><![CDATA[<p>Ahh ok.<br />
Danke...<br />
Is aber auch verwirrend.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1931127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1931127</guid><dc:creator><![CDATA[AceKiller73]]></dc:creator><pubDate>Sat, 24 Jul 2010 18:44:13 GMT</pubDate></item></channel></rss>