<?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[Linker-Problem bei Template-Methode]]></title><description><![CDATA[<p><strong>edit&gt; Linker Problem geloest, es bleibt ein grundsaetliches Problem bei<br />
Verwendung von Templates..vielen Dank fuer euere Hilfe bisher !</strong></p>
<p>Hallo,<br />
Ich habe eine verkettete Liste geschrieben, die Template-Objekte aufnehmen soll.</p>
<p>Dazu habe ich (nun) den Datenknoten zu einer Template Klasse (template &lt;class T&gt;<br />
class Component{..}) gemacht.</p>
<p>In der Main-Funktion wird ein spezifisches Template-Objekt (Component&lt;Typ1&gt;)<br />
erzeugt. Dies geschieht durch einen Konstruktor der den jeweiligen Typ übergeben<br />
bekommt und in T speichert.<br />
Das funktioniert auch soweit.<br />
Nun zum Problem:<br />
Die Liste sowie der Kopf- und Endknoten sind keine Template-Klassen. Da dort<br />
lediglich die Methode add() mit einem template-Objekt in Berührung kommt, habe<br />
ich die add Funktionen zu template &lt;class T&gt; Funktionen gemacht.</p>
<p>Also zB in HeadNode:</p>
<pre><code class="language-cpp">class Headnode : public Node
{
public:
  ..
  template &lt;class T&gt;
  Node * add(Component&lt;T&gt; *t);
  ..
}
</code></pre>
<p>Auch Endknoten und Liste sind so aufgesetzt.<br />
Ebenso die Kalsse Node, nur ist diese Methode auf = 0 gesetzt, damit Node zu<br />
einem ADT wird, da diese nur von den erbenden Klassen überschrieben werden<br />
soll.</p>
<p>Das Problem ist: Wenn ich nun das in main erzeugte Objekt an die Liste übergeben<br />
will, scheint es ein Problem zu geben.<br />
Der Linker sagt er könne die Referenz auf Node * Node::add(Component&lt;Typ1&gt; <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="😉"
    /><br />
nicht auflösen.<br />
Die add-Methoden sehen, wie erwähnt alle wie folgt aus:</p>
<p>add(Component&lt;T&gt; *t){...}</p>
<p>das soll so sein, weil ich dieser add-Methode beliebige Objekte übergeben<br />
möchte, die dann entweder delegiert oder in einem DatenElement gespeichert<br />
werden sollen.</p>
<p>Wo könnte das Problem liegen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/119358/linker-problem-bei-template-methode</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 23:17:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/119358.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 31 Aug 2005 11:17:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Linker-Problem bei Template-Methode on Thu, 01 Sep 2005 08:47:06 GMT]]></title><description><![CDATA[<p><strong>edit&gt; Linker Problem geloest, es bleibt ein grundsaetliches Problem bei<br />
Verwendung von Templates..vielen Dank fuer euere Hilfe bisher !</strong></p>
<p>Hallo,<br />
Ich habe eine verkettete Liste geschrieben, die Template-Objekte aufnehmen soll.</p>
<p>Dazu habe ich (nun) den Datenknoten zu einer Template Klasse (template &lt;class T&gt;<br />
class Component{..}) gemacht.</p>
<p>In der Main-Funktion wird ein spezifisches Template-Objekt (Component&lt;Typ1&gt;)<br />
erzeugt. Dies geschieht durch einen Konstruktor der den jeweiligen Typ übergeben<br />
bekommt und in T speichert.<br />
Das funktioniert auch soweit.<br />
Nun zum Problem:<br />
Die Liste sowie der Kopf- und Endknoten sind keine Template-Klassen. Da dort<br />
lediglich die Methode add() mit einem template-Objekt in Berührung kommt, habe<br />
ich die add Funktionen zu template &lt;class T&gt; Funktionen gemacht.</p>
<p>Also zB in HeadNode:</p>
<pre><code class="language-cpp">class Headnode : public Node
{
public:
  ..
  template &lt;class T&gt;
  Node * add(Component&lt;T&gt; *t);
  ..
}
</code></pre>
<p>Auch Endknoten und Liste sind so aufgesetzt.<br />
Ebenso die Kalsse Node, nur ist diese Methode auf = 0 gesetzt, damit Node zu<br />
einem ADT wird, da diese nur von den erbenden Klassen überschrieben werden<br />
soll.</p>
<p>Das Problem ist: Wenn ich nun das in main erzeugte Objekt an die Liste übergeben<br />
will, scheint es ein Problem zu geben.<br />
Der Linker sagt er könne die Referenz auf Node * Node::add(Component&lt;Typ1&gt; <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="😉"
    /><br />
nicht auflösen.<br />
Die add-Methoden sehen, wie erwähnt alle wie folgt aus:</p>
<p>add(Component&lt;T&gt; *t){...}</p>
<p>das soll so sein, weil ich dieser add-Methode beliebige Objekte übergeben<br />
möchte, die dann entweder delegiert oder in einem DatenElement gespeichert<br />
werden sollen.</p>
<p>Wo könnte das Problem liegen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/861960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/861960</guid><dc:creator><![CDATA[lgn]]></dc:creator><pubDate>Thu, 01 Sep 2005 08:47:06 GMT</pubDate></item><item><title><![CDATA[Reply to Linker-Problem bei Template-Methode on Wed, 31 Aug 2005 12:11:34 GMT]]></title><description><![CDATA[<p>Hast du die add-Memberfunktion in der Header-Datei implementiert? Oder in einer cpp Datei? Muss nämlich in den Header rein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/862006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/862006</guid><dc:creator><![CDATA[template&amp;lt;]]></dc:creator><pubDate>Wed, 31 Aug 2005 12:11:34 GMT</pubDate></item><item><title><![CDATA[Reply to Linker-Problem bei Template-Methode on Wed, 31 Aug 2005 13:13:59 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>also der einfachheithalber sind Deklaration und Methoden alle Knoten und der<br />
Liste zur Zeit in einer Header-Datei untergebracht die in main.cpp eingebunden<br />
wird. Allerdings sind die add-Methoden, die einen Datenknoten erstellen und<br />
diesen den Wert übergeben ausserhalb der Klassendeklaration untergebracht.</p>
<p>Also so bei HeadNode und der Liste (die nur delegieren)<br />
&lt;nodes.hpp&gt;</p>
<pre><code class="language-cpp">class HeadNode{
public:
  ..
  template &lt;class T&gt;
  Node * add(DataNode&lt;T&gt; *t){thisNext-&gt;add(t)}
  ..
private:
  Node *thisNext;
}
</code></pre>
<p>Und bei TailNode und DataNode (da diese beiden ja Knoten hinzufügen sollen)</p>
<pre><code class="language-cpp">class TailNode : public Node{
public:
  ..
  template &lt;class T&gt;
  Node * add(DataNode&lt;T&gt; *t);
  ..
private:
  Node *thisNext;
  T *thisData // nur im DatenKnoten
}

template &lt;class T&gt;
Node * TailNode::add(DataNode&lt;T&gt; *t){  
  ..
  DataNode *newDataNode = new DataNode;
  // Kopier-Konstruktor dann Kopie an Liste anfügen
  ..
}
</code></pre>
<p>Hatte mich eben unglücklich ausgedrückt, es soll ein Datenknoten übergeben<br />
werden, von dem eine Kopie um entsprechende Referenzen ergänzt in die Liste<br />
eingefügt werden. Also nicht add(Component&lt;T&gt; *t) sondern add(DataNode&lt;T&gt; *t).<br />
DataNode ist die Template-Klasse, die die übergebenen Objekte (typ1, typ2 etc)<br />
in T ablegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/862042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/862042</guid><dc:creator><![CDATA[lgn]]></dc:creator><pubDate>Wed, 31 Aug 2005 13:13:59 GMT</pubDate></item><item><title><![CDATA[Reply to Linker-Problem bei Template-Methode on Wed, 31 Aug 2005 13:14:29 GMT]]></title><description><![CDATA[<p>Es geht weder um HeadNode::add noch um TailNode::add. Der Linker kann Node::add nicht finden. Was ist damit?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/862047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/862047</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Wed, 31 Aug 2005 13:14:29 GMT</pubDate></item><item><title><![CDATA[Reply to Linker-Problem bei Template-Methode on Wed, 31 Aug 2005 15:45:19 GMT]]></title><description><![CDATA[<p>Die Node-Klasse soll ein ADT für die anderen Knotenklassen sein.</p>
<p>Implementation ist wie folgt:</p>
<pre><code class="language-cpp">class Node{
public:
  ..
  template &lt;class T&gt;
  Node * add(DataNode&lt;T&gt; *t) = 0;
  ..
}
</code></pre>
<p>Das Schlüsselwort virtual hat der Compiler, in ähnlichem Zusammenhang, schonmal<br />
angemeckert. Gibt es da eine Besonderheit bei Template-Methoden?</p>
<p>DataNode erbt von Node, ist aber eine Template-Klasse:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class DataNode : public Node{
  ..
}
</code></pre>
<p>Die Methode add(DataNode&lt;T&gt; *t) soll von allen erbenden Klassen überschrieben werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/862073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/862073</guid><dc:creator><![CDATA[lgn]]></dc:creator><pubDate>Wed, 31 Aug 2005 15:45:19 GMT</pubDate></item><item><title><![CDATA[Reply to Linker-Problem bei Template-Methode on Wed, 31 Aug 2005 15:42:12 GMT]]></title><description><![CDATA[<p>Nachtrag:</p>
<p>Das Schlüsselwort virtual habe ich nicht, wie vorher angegeben, in Node oder den<br />
erbenden Klassen angegeben.<br />
Schreibe ich virtual vor template, teilt der Compiler mit, dass virtual nur auf<br />
Fuktionen angewandt werden darf. Schreibe ich das Wort vor den Rückgabewert der<br />
Methode, mahnt der Compiler 'illegal use of ''virtual'.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/862186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/862186</guid><dc:creator><![CDATA[lgn]]></dc:creator><pubDate>Wed, 31 Aug 2005 15:42:12 GMT</pubDate></item><item><title><![CDATA[Reply to Linker-Problem bei Template-Methode on Wed, 31 Aug 2005 15:40:19 GMT]]></title><description><![CDATA[<p>virtual ist nicht in verbindung mit templates erlaubt!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/862188</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/862188</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Wed, 31 Aug 2005 15:40:19 GMT</pubDate></item><item><title><![CDATA[Reply to Linker-Problem bei Template-Methode on Wed, 31 Aug 2005 16:49:25 GMT]]></title><description><![CDATA[<p>Ich habe ein weiteres Verständnis-Problem bzgl. Templates was zu einem<br />
Link-Fehler führt:</p>
<p>Ich erzeuge in main einen Data-Knoten vom Typ1 und übergebe diesem ein Objekt<br />
von Typ1, welches in T gespeichert wird:</p>
<pre><code class="language-cpp">..
DataNode&lt;Typ1&gt; *test = new DataNode&lt;Typ1&gt;(obj_typ1);

liste.add(test);
</code></pre>
<p>Die Zuweisung alleine geht, das hinzufügen zur liste allerdings nicht..</p>
<pre><code>Link Fehler: undefined reference to Node::add&lt;typ1&gt;(DataNode &lt;typ1&gt; *)
</code></pre>
<p>Es soll für alle T-Elemente (typ1, typ2..) die Methode ..</p>
<pre><code class="language-cpp">template &lt;class T&gt;
..  add(DataNode&lt;T&gt; *t){..}
</code></pre>
<p>verwendet werden. Rückgabewert ist void für die Liste, Node für alle anderen.<br />
Die Liste erbt nicht von Node.</p>
<p>Die Methode ist in Node deklariert und soll eigentlich überschrieben werden:</p>
<pre><code class="language-cpp">class Node{
  .. 
  template &lt;class T&gt;
  Node * add(DataNode&lt;T&gt; *t) = 0;
  ..
}
</code></pre>
<p>Wie schaffe ich das alle DataNode-Typen derselbe Methode add(DataNode&lt;T&gt; *t)<br />
zugewiesen werden?</p>
<p>Vielen Dank für euere Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/862225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/862225</guid><dc:creator><![CDATA[lgn]]></dc:creator><pubDate>Wed, 31 Aug 2005 16:49:25 GMT</pubDate></item><item><title><![CDATA[Reply to Linker-Problem bei Template-Methode on Wed, 31 Aug 2005 18:00:18 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class Node{
  ..
  template &lt;class T&gt;
  Node * add(DataNode&lt;T&gt; *t) = 0;
  ..
}
</code></pre>
<p>dies würd ich am ehesten als groben unfug bezeichnen, da &quot;=0&quot; nur mit &quot;virtual&quot; zusammen funktioniert. Und da virtual nicht zusammen mit templates funktioniert ists essig mit überschreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/862269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/862269</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Wed, 31 Aug 2005 18:00:18 GMT</pubDate></item><item><title><![CDATA[Reply to Linker-Problem bei Template-Methode on Thu, 01 Sep 2005 08:46:12 GMT]]></title><description><![CDATA[<p>Danke fuer euere Hilfe!</p>
<p>Ja das habe ich schon befuerchtet. Ich habe versucht der Template-Methode add die<br />
virtual Deklaration irgentwie aufzuzwaengen. Denn ohne diese Deklaration habe ich<br />
ein Problem.</p>
<p>Ich brauche Node und dessen Methode add(DataNode&lt;T&gt; *t) als allgemeine Referenz<br />
auf ein Knotenobjekt.</p>
<p>Gibt es eine Moeglichkeit, wie ich auf die Methode add(DataNode&lt;T&gt; *t) von der<br />
erbenden Klassen zugreifen kann?</p>
<p>In Node ist jetzt add(DataNode&lt;T&gt; *t){}, damit kompiliert das Programm und die<br />
DatenKnoten werden delegiert. Allerdings nicht hinzugefuegt, da die nicht als<br />
virtuell deklarierbare Methode von Node aufgerufen wird und nicht die entsprechende<br />
des Objekts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/862545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/862545</guid><dc:creator><![CDATA[lgn]]></dc:creator><pubDate>Thu, 01 Sep 2005 08:46:12 GMT</pubDate></item></channel></rss>