<?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[Probleme mit Template-Klasse]]></title><description><![CDATA[<p>Hallo,</p>
<p>zur Übung habe ich mir eine kleine Template-Listenklasse geschrieben und um einen Iterator ergänzt (als geschachtelte Klasse innerhalb der Listenklasse). Jetzt wollte ich eine find-Methode implementieren, welche die Liste nach einem Element durchsucht und einen Iterator auf das (erste) gefundene Element zurückgibt.</p>
<pre><code class="language-cpp">// liste.h
#ifndef liste_h
#define liste_h liste_h

template&lt;class T&gt; 
class Liste
{
    //...
private:
    struct Listenelement
    { //...
    };

public:
    // Iteratorklasse
    class Iterator
    {
    public:
        friend Liste;
    // ...
    };// Ende Iteratorklasse

    void erase(Iterator&amp; pos);

    // Problem
    Iterator find(Iterator Start, Iterator Ende, const Listenelement&amp; Wert) const;
};
#include &quot;liste.cpp&quot;
#endif
</code></pre>
<pre><code class="language-cpp">// liste.cpp
template&lt;class T&gt;
inline Iterator Liste&lt;T&gt;::find(Iterator Start, Iterator Ende, const Listenelement &amp;Wert) const
{
    //...
    return Start;
}
</code></pre>
<p>Allerdings macht mir bei dieser Methode der Rückgabetyp &quot;Iterator&quot; Probleme. Der Compiler bringt Fehlermeldungen, die danach aussehen, dass er den Typ Iterator nicht kennt. Allerdings hat er in der Argumentliste mit diesem Typ keine Probleme: wenn ich void zurückgebe (siehe erase()), funktioniert das.<br />
Das Problem liegt irgendwie an der separaten Implementationsdatei. Wenn ich die Implementation direkt im Header-/Templatefile vornehme funktioniert alles. Warum das so ist, verstehe ich allerdings nicht ganz <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Vielleicht kann mich jemand aufklären und mir erklären, wie ich das löse, (wenn ich auf einer separaten Implementationsdatei beharre ;)).</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/170337/probleme-mit-template-klasse</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 02:48:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/170337.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 14 Jan 2007 16:29:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit Template-Klasse on Sun, 14 Jan 2007 16:29:48 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>zur Übung habe ich mir eine kleine Template-Listenklasse geschrieben und um einen Iterator ergänzt (als geschachtelte Klasse innerhalb der Listenklasse). Jetzt wollte ich eine find-Methode implementieren, welche die Liste nach einem Element durchsucht und einen Iterator auf das (erste) gefundene Element zurückgibt.</p>
<pre><code class="language-cpp">// liste.h
#ifndef liste_h
#define liste_h liste_h

template&lt;class T&gt; 
class Liste
{
    //...
private:
    struct Listenelement
    { //...
    };

public:
    // Iteratorklasse
    class Iterator
    {
    public:
        friend Liste;
    // ...
    };// Ende Iteratorklasse

    void erase(Iterator&amp; pos);

    // Problem
    Iterator find(Iterator Start, Iterator Ende, const Listenelement&amp; Wert) const;
};
#include &quot;liste.cpp&quot;
#endif
</code></pre>
<pre><code class="language-cpp">// liste.cpp
template&lt;class T&gt;
inline Iterator Liste&lt;T&gt;::find(Iterator Start, Iterator Ende, const Listenelement &amp;Wert) const
{
    //...
    return Start;
}
</code></pre>
<p>Allerdings macht mir bei dieser Methode der Rückgabetyp &quot;Iterator&quot; Probleme. Der Compiler bringt Fehlermeldungen, die danach aussehen, dass er den Typ Iterator nicht kennt. Allerdings hat er in der Argumentliste mit diesem Typ keine Probleme: wenn ich void zurückgebe (siehe erase()), funktioniert das.<br />
Das Problem liegt irgendwie an der separaten Implementationsdatei. Wenn ich die Implementation direkt im Header-/Templatefile vornehme funktioniert alles. Warum das so ist, verstehe ich allerdings nicht ganz <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Vielleicht kann mich jemand aufklären und mir erklären, wie ich das löse, (wenn ich auf einer separaten Implementationsdatei beharre ;)).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1209785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1209785</guid><dc:creator><![CDATA[Nanuq]]></dc:creator><pubDate>Sun, 14 Jan 2007 16:29:48 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Template-Klasse on Mon, 15 Jan 2007 05:38:57 GMT]]></title><description><![CDATA[<p>Nanuq schrieb:</p>
<blockquote>
<p>Der Compiler bringt Fehlermeldungen, die danach aussehen, dass er den Typ Iterator nicht kennt.</p>
</blockquote>
<p>Ein Tipp für die Zukunft: Schreibe nicht, wonach die Fehlermeldungen für dich &quot;aussehen&quot;. <strong>Schreibe den exakten Wortlaut der Fehlermeldungen.</strong> Wenn's Compilerfehler sind, kennzeichne auch die Position im Code.</p>
<p>Der Unterschied ist nicht, in welcher Datei die Methode definiert ist, sondern ob sie innerhalb der Klassendefinition oder außerhalb steht. Außerhalb musst du Liste&lt;T&gt;::Iterator schreiben, weil Iterator eine innere Klasse von Liste ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1210003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1210003</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Mon, 15 Jan 2007 05:38:57 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Template-Klasse on Mon, 15 Jan 2007 06:02:18 GMT]]></title><description><![CDATA[<p>genau genommen muss es</p>
<pre><code class="language-cpp">typename Liste&lt;T&gt;::Iterator Liste&lt;T&gt;::find
</code></pre>
<p>heissen. das typename ist nur dafür da, damit der compiler weiss, dass das nach dem Liste&lt;T&gt;:: ein typ ist, und nicht eine Konstante</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1210006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1210006</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Mon, 15 Jan 2007 06:02:18 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Template-Klasse on Mon, 15 Jan 2007 06:30:57 GMT]]></title><description><![CDATA[<p>Danke für die Antworten!</p>
<p>Vielleicht noch zur Ergänzung:<br />
das &quot;typename&quot; ist erforderlich. Wenn ich nur Liste&lt;T&gt;::Iterator schreibe, ist der Compiler trotzdem nicht einverstanden.</p>
<p>MFK schrieb:</p>
<blockquote>
<p>Ein Tipp für die Zukunft: Schreibe nicht, wonach die Fehlermeldungen für dich &quot;aussehen&quot;. Schreibe den exakten Wortlaut der Fehlermeldungen. Wenn's Compilerfehler sind, kennzeichne auch die Position im Code.</p>
</blockquote>
<p>Werde ich mir merken. Ich dachte halt, mit &quot;missing ; before Liste&lt;T&gt;::find&quot; fängt man nicht allzuviel an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1210008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1210008</guid><dc:creator><![CDATA[Nanuq]]></dc:creator><pubDate>Mon, 15 Jan 2007 06:30:57 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Template-Klasse on Mon, 15 Jan 2007 07:11:45 GMT]]></title><description><![CDATA[<p>Kleine Ergänzung: Die Unterklasse 'Listenelement' ist privat, also wird wohl niemand von außen deine find()-Methode aufrufen können (weil niemand außerhalb in der Lage ist, den letzten Parameter bereitzustellen) - verwende dort lieber T oder const T&amp;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1210020</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1210020</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 15 Jan 2007 07:11:45 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Template-Klasse on Mon, 15 Jan 2007 17:16:46 GMT]]></title><description><![CDATA[<p>Da hast du natürlich Recht, war ein Denkfehler:<br />
Listenelement beinhaltet noch die Pointer auf Vorgänger- und Nachfolger innerhalb der doppelt verketteten Liste, ich suche nur den eigentlichen Wert eines Elements. Entsprechend ist auch der Dereferenzierungoperator des Iterators implementiert.</p>
<p>Danke jedenfalls! Ich denke, so sollte das dann passen:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
inline typename Liste&lt;T&gt;::Iterator Liste&lt;T&gt;::find(Iterator Start, Iterator Ende, const T&amp; Wert) const
{
	while(Start != Ende &amp;&amp; *Start != Wert)
	{
		Start++;
	}
	return Start;
}
</code></pre>
<p>...wobei ich mir vielleicht noch überlegen sollte, was ich zurückgebe, wenn der Wert nicht gefunden wird, anstatt einfach den Iterator auf das Listenende zurückzugeben...?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1210384</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1210384</guid><dc:creator><![CDATA[Nanuq]]></dc:creator><pubDate>Mon, 15 Jan 2007 17:16:46 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Template-Klasse on Mon, 15 Jan 2007 17:20:21 GMT]]></title><description><![CDATA[<p>Nanuq schrieb:</p>
<blockquote>
<p>...wobei ich mir vielleicht noch überlegen sollte, was ich zurückgebe, wenn der Wert nicht gefunden wird, anstatt einfach den Iterator auf das Listenende zurückzugeben...?</p>
</blockquote>
<p>Würd ich aber so machen (tut die STL ja auch) und entsprechend dokumentieren. Dann kannst du immer mit &quot;!= Ende&quot; auf Gültigkeit des Iterators prüfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1210386</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1210386</guid><dc:creator><![CDATA[THX 1138]]></dc:creator><pubDate>Mon, 15 Jan 2007 17:20:21 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Template-Klasse on Mon, 15 Jan 2007 17:52:19 GMT]]></title><description><![CDATA[<p>Jo, nix anderes erwartet man von einem Iterator in C++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1210398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1210398</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Mon, 15 Jan 2007 17:52:19 GMT</pubDate></item></channel></rss>