<?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[Eigene Vektorklasse verursacht Linkerror]]></title><description><![CDATA[<p>Hi.<br />
Ich habe mich mal an einer Vektorklasse probiert, geht mir eher ums testen mit Templates und so.</p>
<p>Hier ist meine C++:</p>
<pre><code class="language-cpp">template &lt;typename T, int iMax&gt;
CVector&lt;T, iMax&gt;::CVector(void)
{
	this-&gt;m_iCurrent = 0;
	this-&gt;m_iMax = iMax;

	for (int i = 0; i &lt; this-&gt;m_iMax; i++)
	{
		this-&gt;m_arrValues[i] = NULL;
	}
}

// irrelevantes rausgeschnitten
</code></pre>
<p>Hier die Headerdatei:</p>
<pre><code class="language-cpp">template &lt;typename T, int iMax = 128&gt;
class CVector
{
public:
	CVector(void);
	void push(T Value);
	void pushTop(T Value);
	T pop(int iIndex);
	T popValue(T Value);
	void popAll(void);
	int find(T Value);

private:
	int m_iCurrent;
	int m_iMax;
	T m_arrValues[iMax];
};
</code></pre>
<p>Und hier der Aufruf:</p>
<pre><code class="language-cpp">CVector&lt;int, 128&gt; test; // Linkerror
// CVector&lt;int, 128&gt; *test = new CVector&lt;int, 128&gt;; // erzeugt den gleichen Fehler
</code></pre>
<p>Ohne den Aufruf compiled alles wunderbar, doch mit gibt es den Linkerror. Ich weiß echt nicht mehr weiter, ich finde keine Lösung.</p>
<p>Hier ist der &quot;genaue&quot; Fehler vom VC++ Compiler:</p>
<pre><code>LNK2019: Verweis auf nicht aufgelöstes externes Symbol &quot;&quot;public: __thiscall CVector&lt;int,128&gt;::CVector&lt;int,128&gt;(void)&quot; (??0?$CVector@H$0IA@@@QAE@XZ)&quot; in Funktion &quot;&quot;public: virtual void __thiscall CDraw::initPre(void)&quot; (?initPre@CDraw@@UAEXXZ)&quot;.
</code></pre>
<p>Bin dankbar für Antworten!</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/255375/eigene-vektorklasse-verursacht-linkerror</link><generator>RSS for Node</generator><lastBuildDate>Sat, 12 Sep 2026 01:30:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/255375.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 30 Nov 2009 00:08:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Eigene Vektorklasse verursacht Linkerror on Mon, 30 Nov 2009 00:09:08 GMT]]></title><description><![CDATA[<p>Hi.<br />
Ich habe mich mal an einer Vektorklasse probiert, geht mir eher ums testen mit Templates und so.</p>
<p>Hier ist meine C++:</p>
<pre><code class="language-cpp">template &lt;typename T, int iMax&gt;
CVector&lt;T, iMax&gt;::CVector(void)
{
	this-&gt;m_iCurrent = 0;
	this-&gt;m_iMax = iMax;

	for (int i = 0; i &lt; this-&gt;m_iMax; i++)
	{
		this-&gt;m_arrValues[i] = NULL;
	}
}

// irrelevantes rausgeschnitten
</code></pre>
<p>Hier die Headerdatei:</p>
<pre><code class="language-cpp">template &lt;typename T, int iMax = 128&gt;
class CVector
{
public:
	CVector(void);
	void push(T Value);
	void pushTop(T Value);
	T pop(int iIndex);
	T popValue(T Value);
	void popAll(void);
	int find(T Value);

private:
	int m_iCurrent;
	int m_iMax;
	T m_arrValues[iMax];
};
</code></pre>
<p>Und hier der Aufruf:</p>
<pre><code class="language-cpp">CVector&lt;int, 128&gt; test; // Linkerror
// CVector&lt;int, 128&gt; *test = new CVector&lt;int, 128&gt;; // erzeugt den gleichen Fehler
</code></pre>
<p>Ohne den Aufruf compiled alles wunderbar, doch mit gibt es den Linkerror. Ich weiß echt nicht mehr weiter, ich finde keine Lösung.</p>
<p>Hier ist der &quot;genaue&quot; Fehler vom VC++ Compiler:</p>
<pre><code>LNK2019: Verweis auf nicht aufgelöstes externes Symbol &quot;&quot;public: __thiscall CVector&lt;int,128&gt;::CVector&lt;int,128&gt;(void)&quot; (??0?$CVector@H$0IA@@@QAE@XZ)&quot; in Funktion &quot;&quot;public: virtual void __thiscall CDraw::initPre(void)&quot; (?initPre@CDraw@@UAEXXZ)&quot;.
</code></pre>
<p>Bin dankbar für Antworten!</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1815224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815224</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Mon, 30 Nov 2009 00:09:08 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Vektorklasse verursacht Linkerror on Mon, 30 Nov 2009 00:34:50 GMT]]></title><description><![CDATA[<p>Templatedefinitionen müssen zum Zeitpunkt der Instanzierung vorliegen. Beim Linken ist es dafür zu spät, darum gibt's den Fehler. das liegt daran, dass der Compiler ohne Kenntnis der Templateparameter keinen Maschinencode erzeugen kann, der später gelinkt werden kann.</p>
<p>Du wirst die Definitionen in den Header schreiben müssen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1815230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815230</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 30 Nov 2009 00:34:50 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Vektorklasse verursacht Linkerror on Mon, 30 Nov 2009 00:42:14 GMT]]></title><description><![CDATA[<p>Verstehe ich nicht. Mit std::vector oder CUtlVector (von VALVe) funktioniert das ganze doch auch problemlos?</p>
<p>Edit: Auch wenn ich das ganze in die Headerdatei packe, ändert sich am Fehler nichts.</p>
<p>Edit2: Hier ist es doch (fast) genauso gelöst wie bei mir: <a href="http://www.willemer.de/informatik/cpp/cpptempl.htm" rel="nofollow">http://www.willemer.de/informatik/cpp/cpptempl.htm</a></p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1815231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815231</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Mon, 30 Nov 2009 00:42:14 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Vektorklasse verursacht Linkerror on Mon, 30 Nov 2009 07:53:53 GMT]]></title><description><![CDATA[<p>Bindest du die HeaderDatei auch in die cpp datei ein. Zeig doch mal bitte den Rest der Datei</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1815269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815269</guid><dc:creator><![CDATA[Fischkopf2009]]></dc:creator><pubDate>Mon, 30 Nov 2009 07:53:53 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Vektorklasse verursacht Linkerror on Mon, 30 Nov 2009 10:58:05 GMT]]></title><description><![CDATA[<p>sry, nix... ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1815334</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815334</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 30 Nov 2009 10:58:05 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Vektorklasse verursacht Linkerror on Mon, 30 Nov 2009 12:29:14 GMT]]></title><description><![CDATA[<p>Natürlich, bin ja nicht auf den Kopf gefallen <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>
<pre><code class="language-cpp">#include &lt;Vector.hpp&gt;

template &lt;typename T, int iMax&gt;
CVector&lt;T, iMax&gt;::CVector(void)
{
	this-&gt;m_iCurrent = 0;
	this-&gt;m_iMax = iMax;

	for (int i = 0; i &lt; this-&gt;m_iMax; i++)
	{
		this-&gt;m_arrValues[i] = NULL;
	}
}

template &lt;typename T, int iMax&gt;
void CVector&lt;T, iMax&gt;::push(T Value)
{
	if (this-&gt;m_iCurrent &gt;= this-&gt;m_iMax)
	{
		m_pTools-&gt;log(&quot;Vector ist bereits komplett gefuellt&quot;);
		return;
	}

	this-&gt;m_arrValues[this-&gt;m_iCurrent++] = Value;
}

template &lt;typename T, int iMax&gt;
void CVector&lt;T, iMax&gt;::pushTop(T Value)
{
	if (this-&gt;m_iCurrent &gt;= this-&gt;m_iMax)
	{
		m_pTools-&gt;log(&quot;Vector ist bereits komplett gefuellt&quot;);
		return;
	}

	if (this-&gt;m_iCurrent)
	{
		for (int i = this-&gt;m_iCurrent - 1; i &gt;= 0; i--)
		{
			this-&gt;m_arrValues[i + 1] = this-&gt;m_arrValues[i];
		}
	}

	this-&gt;m_arrValues[0] = Value;
}

template &lt;typename T, int iMax&gt;
T CVector&lt;T, iMax&gt;::pop(int iIndex)
{
	if (iIndex &gt;= this-&gt;m_iCurrent)
	{
		m_pTools-&gt;log(&quot;Vector hat nur %i Eintraege&quot;, this-&gt;m_iCurrent);
		return;
	}

	// to be continued...
}

template &lt;typename T, int iMax&gt;
T CVector&lt;T, iMax&gt;::popValue(T Value)
{
	int iIndex = this-&gt;find(Value);

	if (iIndex &gt;= 0)
	{
		this-&gt;pop(iIndex);
	}
}

template &lt;typename T, int iMax&gt;
void CVector&lt;T, iMax&gt;::popAll(void)
{
	for (int i = 0; i &lt; this-&gt;m_iCurrent; i++)
	{
		this-&gt;m_arrValues[i] = NULL;
	}

	this-&gt;m_iCurrent = 0;
}

template &lt;typename T, int iMax&gt;
int CVector&lt;T, iMax&gt;::find(T Value)
{
	for (int i = 0; i &lt; this-&gt;m_iCurrent; i++)
	{
		if (T == this-&gt;m_arrValues[i])
		{
			return i;
		}
	}

	m_pTools-&gt;log(&quot;Vector Eintrag konnte nicht gefunden werden&quot;);

	return -1;
}

template &lt;typename T, int iMax&gt;
int CVector&lt;T, iMax&gt;::count(void)
{
	return this-&gt;m_iCurrent;
}
</code></pre>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1815369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815369</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Mon, 30 Nov 2009 12:29:14 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Vektorklasse verursacht Linkerror on Mon, 30 Nov 2009 12:33:37 GMT]]></title><description><![CDATA[<p>Und das steht in welcher Datei?<br />
Hoffentlich auch in der Header Datei, oder in einer cpp, inl, oder wie auch immer die in die Header Datei eingebunden wird.</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1815372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815372</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Mon, 30 Nov 2009 12:33:37 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Vektorklasse verursacht Linkerror on Mon, 30 Nov 2009 12:50:53 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<pre><code class="language-cpp">#include &lt;Vector.hpp&gt;

template &lt;typename T, int iMax&gt;
CVector&lt;T, iMax&gt;::CVector(void)
{
	this-&gt;m_iCurrent = 0;
	this-&gt;m_iMax = iMax;
	
	for (int i = 0; i &lt; this-&gt;m_iMax; i++)
	{
		this-&gt;m_arrValues[i] = NULL;
	}
}

...
</code></pre>
</blockquote>
<p>Ja und nun? Ist doch klar wie Kloßbrühe, warum das nicht geht. Hat SeppJ ja auch schon erklärt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1815379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815379</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Mon, 30 Nov 2009 12:50:53 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Vektorklasse verursacht Linkerror on Mon, 30 Nov 2009 13:00:33 GMT]]></title><description><![CDATA[<p>Btw:<br />
Der richtige std::vector benutzt einen abgekapselten Memory-Allocator (std::allocator). Sollteste vielleicht auch nutzen <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/1815383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815383</guid><dc:creator><![CDATA[Kóyaánasqatsi]]></dc:creator><pubDate>Mon, 30 Nov 2009 13:00:33 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Vektorklasse verursacht Linkerror on Mon, 30 Nov 2009 13:18:16 GMT]]></title><description><![CDATA[<p>Hi.<br />
Also erstmal danke für die Antworten. Aber ich sehe da nichts, was falsch ist?! Wo fehlt denn da eine &quot;Templatedefinition&quot;? Ich definiere die Klasse doch in der Headerdatei und packe den Code dann in die C++-Datei - wie immer. Ist das etwa falsch?</p>
<p>Tut mir leid dass ich da nichts erkenne, aber für mich ist das Neuland.</p>
<p>@ Kóyaánasqatsi: Das ist mir zu kompliziert ^^ Da müsste ich mich erst einmal reinarbeiten. Ich will sowas ja auch selber probieren <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>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1815391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815391</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Mon, 30 Nov 2009 13:18:16 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Vektorklasse verursacht Linkerror on Mon, 30 Nov 2009 13:49:38 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich definiere die Klasse doch in der Headerdatei und packe den Code dann in die C++-Datei - wie immer. Ist das etwa falsch?</p>
</blockquote>
<p>Ja.</p>
<pre><code class="language-cpp">template&lt;typename T&gt; class vector; // Klassen-Template-DeKLARAtion

template&lt;typename T&gt; class vector  // Klassen-Template-DeFINItion
{
  T *beg, *end, *cap;
public:
  vector();  // DeKLARAtion des Konstruktors
  ...
};

template&lt;typename T&gt;
vector&lt;T&gt;::vector()       // DeFINItion des Konstruktors
: beg(0), end(0), cap(0)
{}
</code></pre>
<p>Wenn Du die DeFINItion des Konstruktors des Klassentemplates in Übersetzungseinheit A versteckst und Du für ein bestimmtes T den aus der Übersetzungseinheit B aufrufen willst, kann zum Zeitpunkt der Kompilierung von ÜE B kein Code für den Konstruktor generiert werden, da ja die DeFINItion unbekannt ist --&gt; Linkerfehler. Lösung: Dem Compiler muss die DeFINItion des Konstruktors bekannt sein, wenn ÜE B kompiliert wird. Die &quot;Eine-Definition-Regel&quot; erlaubt Mehrfachdefinitionen (höchstens eine pro ÜE) von Klassen, Klassentemplates, inline-Funktionen, Funktionstemplates, Elementfunktionen von Klassentemplates und statische Datenelemente von Klassentemplates (mag sein, dass ich noch etwas vergessen habe), sofern die Definition &quot;dieselbe&quot; ist. Von daher ist es auch nicht schlimm, wenn Du die Definition in einen Header packst und den Header in mehreren ÜEs einbindest.</p>
<p>Die Trennung von Deklaration und Definition für Templates in versch ÜEs wird zwar vom Standard erlaubt, erfordert aber 1. das <code>export</code> Schlüsselwort und 2. einen Compiler, der <code>export</code> auch versteht und verarbeiten kann. Unterstützung für &quot;exported templates&quot; bieten aber die meisten Compiler nicht und man denkt sogar darüber nach, <code>export</code> wieder aus dem C++ Standard zu schmeißen, weil's sich als &quot;schwierig umsetzbar&quot; herausgestellt hat. Man würde sich damit der Realität wieder annähern.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1815397</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815397</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Mon, 30 Nov 2009 13:49:38 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Vektorklasse verursacht Linkerror on Mon, 30 Nov 2009 13:45:52 GMT]]></title><description><![CDATA[<p>Ui!<br />
Danke für die ausführliche Erklärung <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Habe es jetzt (hoffe ich) verstanden und es nun gelöst <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>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1815399</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815399</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Mon, 30 Nov 2009 13:45:52 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Vektorklasse verursacht Linkerror on Mon, 30 Nov 2009 13:49:08 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>Aber ich sehe da nichts, was falsch ist?! Wo fehlt denn da eine &quot;Templatedefinition&quot;? Ich definiere die Klasse doch in der Headerdatei und packe den Code dann in die C++-Datei - wie immer. Ist das etwa falsch?</p>
</blockquote>
<p>Zum wiederholten Male: Ja, das ist falsch! Bei Templates funktioniert das so nicht. Der Compiler kann aus einem Template keinen Objektcode erzeugen - ist ja nur eine Vorlage für Programmcode. Die Templateparameter müssen bekannt sein, damit Code erzeugt werden kann. Daher wird aus deiner c++-Datei genau Nichts erzeugt. Und daher findet der Linker später keinen Code den er linken kann.</p>
<p>Sind dir die Begriffe &quot;Deklaration&quot;, &quot;Definition&quot;, &quot;Compiler&quot; und &quot;Linker&quot; eigentlich vollständig klar? Ich habe den Eindruck, dass du dich da nicht so genau mit auskennst. Falls das so ist, frag ruhig mal nach.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1815401</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815401</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 30 Nov 2009 13:49:08 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Vektorklasse verursacht Linkerror on Mon, 30 Nov 2009 13:49:07 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich definiere die Klasse doch in der Headerdatei und packe den Code dann in die C++-Datei - wie immer. Ist das etwa falsch?</p>
</blockquote>
<p>Ja!</p>
<p>s. den Artikel <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-128361.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-128361.html</a> insbesondere Punkt 7 &quot;Das Schlüsselwort export&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1815402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815402</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Mon, 30 Nov 2009 13:49:07 GMT</pubDate></item></channel></rss>