<?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[Problem mit Klassen-Template]]></title><description><![CDATA[<p>Hallo,<br />
ich habe ein Problem eine normale Klasse in eine Template Klasse umzuschreiben. Es handelt sich dabei um eine Aufgabe aus der Hochschule und zwar soll man eine eigene Klasse Set die std::list verwendet um eine Menge an floats zu speichern, in ein Template umschreiben, so das ich auch andere Datentypen damit verwenden kann.</p>
<p>Die nicht-Template Klasse SetOfFloats funktioniert einwandfrei, jedoch nachdem ich meine Finger daran hatte leider nicht mehr <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Hier erstmal die normale SetOfFloats Klasse:</p>
<pre><code class="language-cpp">/*
 * File:   SetOfFloats.h
 * Author: Prof. Dr. R. C. Moore (Fb I, h-da.de)
 *
 * Created on June 20, 2012, 8:22 PM
 */

#ifndef SETOFFLOATS_H
#define SETOFFLOATS_H

#include &lt;string&gt;
#include &lt;sstream&gt;
#include &lt;list&gt;

class SetOfFloats {
public:

    SetOfFloats() { // default constructor - creates empty set

    }

    ~SetOfFloats() { // destructor

    }

    int size() { // returns number of elements
        return this-&gt;list_.size();
    }

    bool is_in_set(float number) {
        std::list&lt;float&gt;::iterator it;
        for (it = this-&gt;list_.begin(); it != this-&gt;list_.end(); it++) {
            if (*it == number)
                return true;
        }
        return false;
    }

    void insert(float number) { // insert number - if not already there
        if (this-&gt;is_in_set(number) == false) {
            this-&gt;list_.push_back(number);
        }
    }

    void remove(float number) { // remove number - if already there
        if (this-&gt;is_in_set(number) == true) {
            this-&gt;list_.remove(number);
        }
    }

    std::string to_string() { // convert set to string - for debug print!
        std::list&lt;float&gt;::iterator it;
        std::ostringstream out;
        std::string print;
        for (it = this-&gt;list_.begin(); it != this-&gt;list_.end(); it++) {
            out &lt;&lt; *it &lt;&lt; &quot; &quot;;
        }
        print = out.str();
        return print;
    }

private:
    std::list&lt;float&gt; list_;
    // Diese Klasse soll (muss, darf) erweitert bzw. geändert werden.

};

#endif  /* SETOFFLOATS_H */
</code></pre>
<p>Und hier nun mein verzweifelter Versuch es in ein Template zu schreiben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<pre><code class="language-cpp">/*
 * File:   Set.h
 * Author: Prof. Dr. R. C. Moore (Fb I, h-da.de)
 *
 * Created on June 20, 2012, 8:22 PM
 */

#ifndef SET_H
#define SET_H

#include &lt;string&gt;
#include &lt;sstream&gt;
#include &lt;list&gt;

template &lt;class T&gt;
class Set {
public:

    Set() { // default constructor - creates empty set

    }

    ~Set() { // destructor

    }

    int size() { // returns number of elements
        return this-&gt;list_.size();
    }

    bool is_in_set(T number) {
        std::list&lt;T&gt;::iterator it;
        for (it = this-&gt;list_.begin(); it != this-&gt;list_.end(); it++) {
            if (*it == number)
                return true;
        }
        return false;
    }

    void insert(T number) { // insert number - if not already there
        if (this-&gt;is_in_set(number) == false) {
            this-&gt;list_.push_back(number);
        }
    }

    void remove(T number) { // remove number - if already there
        if (this-&gt;is_in_set(number) == true) {
            this-&gt;list_.remove(number);
        }
    }

    std::string to_string() { // convert set to string - for debug print!
        std::list&lt;T&gt;::iterator it;
        std::ostringstream out;
        std::string print;
        for (it = this-&gt;list_.begin(); it != this-&gt;list_.end(); it++) {
            out &lt;&lt; *it &lt;&lt; &quot; &quot;;
        }
        print = out.str();
        return print;
    }

private:
    std::list&lt;T&gt; list_;
    // Diese Klasse soll (muss, darf) erweitert bzw. geändert werden.

};

#endif  /* SET_H */
</code></pre>
<p>Als Fehlermeldungen bekomme ich folgendes:</p>
<p>Set.h:30:15: Fehler: Deklaration von �class T�<br />
Set.h:15:11: Fehler: �berdeckt Templateparameter �class T�<br />
Set.h:32:9: Fehler: �typename� vor �std::list&lt;T&gt;::iterator� erforderlich, da �std::list&lt;T&gt;� ein abh�ngiger G�ltigkeitsbereich ist<br />
Set.h:32:32: Fehler: expected �;� before �it�<br />
Set.h:33:14: Fehler: �it� wurde in diesem G�ltigkeitsbereich nicht definiert<br />
Set.h:53:9: Fehler: �typename� vor �std::list&lt;T&gt;::iterator� erforderlich, da �std::list&lt;T&gt;� ein abh�ngiger G�ltigkeitsbereich ist<br />
Set.h:53:32: Fehler: expected �;� before �it�<br />
Set.h:56:14: Fehler: �it� wurde in diesem G�ltigkeitsbereich nicht definiert</p>
<p>Ich danke euch schonmal vielmals für eure Hilfe!</p>
<p>MfG Xarsis</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/305334/problem-mit-klassen-template</link><generator>RSS for Node</generator><lastBuildDate>Sun, 09 Aug 2026 00:31:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/305334.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 26 Jun 2012 14:44:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Klassen-Template on Tue, 26 Jun 2012 14:44:40 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe ein Problem eine normale Klasse in eine Template Klasse umzuschreiben. Es handelt sich dabei um eine Aufgabe aus der Hochschule und zwar soll man eine eigene Klasse Set die std::list verwendet um eine Menge an floats zu speichern, in ein Template umschreiben, so das ich auch andere Datentypen damit verwenden kann.</p>
<p>Die nicht-Template Klasse SetOfFloats funktioniert einwandfrei, jedoch nachdem ich meine Finger daran hatte leider nicht mehr <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Hier erstmal die normale SetOfFloats Klasse:</p>
<pre><code class="language-cpp">/*
 * File:   SetOfFloats.h
 * Author: Prof. Dr. R. C. Moore (Fb I, h-da.de)
 *
 * Created on June 20, 2012, 8:22 PM
 */

#ifndef SETOFFLOATS_H
#define SETOFFLOATS_H

#include &lt;string&gt;
#include &lt;sstream&gt;
#include &lt;list&gt;

class SetOfFloats {
public:

    SetOfFloats() { // default constructor - creates empty set

    }

    ~SetOfFloats() { // destructor

    }

    int size() { // returns number of elements
        return this-&gt;list_.size();
    }

    bool is_in_set(float number) {
        std::list&lt;float&gt;::iterator it;
        for (it = this-&gt;list_.begin(); it != this-&gt;list_.end(); it++) {
            if (*it == number)
                return true;
        }
        return false;
    }

    void insert(float number) { // insert number - if not already there
        if (this-&gt;is_in_set(number) == false) {
            this-&gt;list_.push_back(number);
        }
    }

    void remove(float number) { // remove number - if already there
        if (this-&gt;is_in_set(number) == true) {
            this-&gt;list_.remove(number);
        }
    }

    std::string to_string() { // convert set to string - for debug print!
        std::list&lt;float&gt;::iterator it;
        std::ostringstream out;
        std::string print;
        for (it = this-&gt;list_.begin(); it != this-&gt;list_.end(); it++) {
            out &lt;&lt; *it &lt;&lt; &quot; &quot;;
        }
        print = out.str();
        return print;
    }

private:
    std::list&lt;float&gt; list_;
    // Diese Klasse soll (muss, darf) erweitert bzw. geändert werden.

};

#endif  /* SETOFFLOATS_H */
</code></pre>
<p>Und hier nun mein verzweifelter Versuch es in ein Template zu schreiben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<pre><code class="language-cpp">/*
 * File:   Set.h
 * Author: Prof. Dr. R. C. Moore (Fb I, h-da.de)
 *
 * Created on June 20, 2012, 8:22 PM
 */

#ifndef SET_H
#define SET_H

#include &lt;string&gt;
#include &lt;sstream&gt;
#include &lt;list&gt;

template &lt;class T&gt;
class Set {
public:

    Set() { // default constructor - creates empty set

    }

    ~Set() { // destructor

    }

    int size() { // returns number of elements
        return this-&gt;list_.size();
    }

    bool is_in_set(T number) {
        std::list&lt;T&gt;::iterator it;
        for (it = this-&gt;list_.begin(); it != this-&gt;list_.end(); it++) {
            if (*it == number)
                return true;
        }
        return false;
    }

    void insert(T number) { // insert number - if not already there
        if (this-&gt;is_in_set(number) == false) {
            this-&gt;list_.push_back(number);
        }
    }

    void remove(T number) { // remove number - if already there
        if (this-&gt;is_in_set(number) == true) {
            this-&gt;list_.remove(number);
        }
    }

    std::string to_string() { // convert set to string - for debug print!
        std::list&lt;T&gt;::iterator it;
        std::ostringstream out;
        std::string print;
        for (it = this-&gt;list_.begin(); it != this-&gt;list_.end(); it++) {
            out &lt;&lt; *it &lt;&lt; &quot; &quot;;
        }
        print = out.str();
        return print;
    }

private:
    std::list&lt;T&gt; list_;
    // Diese Klasse soll (muss, darf) erweitert bzw. geändert werden.

};

#endif  /* SET_H */
</code></pre>
<p>Als Fehlermeldungen bekomme ich folgendes:</p>
<p>Set.h:30:15: Fehler: Deklaration von �class T�<br />
Set.h:15:11: Fehler: �berdeckt Templateparameter �class T�<br />
Set.h:32:9: Fehler: �typename� vor �std::list&lt;T&gt;::iterator� erforderlich, da �std::list&lt;T&gt;� ein abh�ngiger G�ltigkeitsbereich ist<br />
Set.h:32:32: Fehler: expected �;� before �it�<br />
Set.h:33:14: Fehler: �it� wurde in diesem G�ltigkeitsbereich nicht definiert<br />
Set.h:53:9: Fehler: �typename� vor �std::list&lt;T&gt;::iterator� erforderlich, da �std::list&lt;T&gt;� ein abh�ngiger G�ltigkeitsbereich ist<br />
Set.h:53:32: Fehler: expected �;� before �it�<br />
Set.h:56:14: Fehler: �it� wurde in diesem G�ltigkeitsbereich nicht definiert</p>
<p>Ich danke euch schonmal vielmals für eure Hilfe!</p>
<p>MfG Xarsis</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2227412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227412</guid><dc:creator><![CDATA[Xarsis]]></dc:creator><pubDate>Tue, 26 Jun 2012 14:44:40 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Klassen-Template on Tue, 26 Jun 2012 14:46:38 GMT]]></title><description><![CDATA[<p>Xarsis schrieb:</p>
<blockquote>
<p>Set.h:32:9: Fehler: �typename� vor �std::list&lt;T&gt;::iterator� erforderlich, da �std::list&lt;T&gt;� ein abh�ngiger G�ltigkeitsbereich ist<br />
Set.h:53:9: Fehler: �typename� vor �std::list&lt;T&gt;::iterator� erforderlich, da �std::list&lt;T&gt;� ein abh�ngiger G�ltigkeitsbereich ist</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2227415</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227415</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 26 Jun 2012 14:46:38 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Klassen-Template on Tue, 26 Jun 2012 14:52:31 GMT]]></title><description><![CDATA[<p>Ich versteh leider nicht ganz was damit gemeint ist.<br />
Könntest du mir das ein wenig genauer erläutern?<br />
Was genau soll denn vor den std::list&lt;T&gt;::iterator? Nochmal template&lt;class T&gt; ? template&lt;typename T&gt; (Ka wo da der unterschied ist)?<br />
Bin gerade ein bisschen verwirrt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2227417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227417</guid><dc:creator><![CDATA[Xarsis]]></dc:creator><pubDate>Tue, 26 Jun 2012 14:52:31 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Klassen-Template on Tue, 26 Jun 2012 15:03:59 GMT]]></title><description><![CDATA[<p>Schon</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
</code></pre>
<p>probiert? Immerhin ist float doch ein Typ und keine Klasse (ich hoffe, ich habe grade keinen peinlichen Denkfehler gemacht^^).</p>
<p>Ansonsten kann ich dir heute abend ein bisschen Hilfe anbieten, solltest du welche bedeuten. Muss jetzt allerdings los.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2227421</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227421</guid><dc:creator><![CDATA[DerCoder]]></dc:creator><pubDate>Tue, 26 Jun 2012 15:03:59 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Klassen-Template on Tue, 26 Jun 2012 15:09:58 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">typename std::list&lt;T&gt;::iterator it;
</code></pre>
<p>std::list&lt;T&gt;::iterator ist ein vom Templateparameter abhängiger Bezeichner. Der Compiler kann bei der Templatedefinition nicht wissen, ob es sich bei diesem Namen um einen Typnamen oder etwas anders handelt. Ohne explizite Angabe wird angenommen, dass es sich nicht um einen Typnamen handelt. Die Unterscheidung ist wichtig für den Parser</p>
<pre><code class="language-cpp">TT&lt;T&gt;::foo*bar; // Ausdruck (Multiplikation)
typename TT&lt;T&gt;::foo*bar; // Deklaration eines Zeigers
</code></pre>
<p>In</p>
<pre><code class="language-cpp">std::list&lt;T&gt;::iterator it;
</code></pre>
<p>geht der Compiler davon aus, dass es sich um einen Ausdruck handelt. Weil aber ein geeigneter Operator fehlt, wird angenommen, dass ein Semikolon vergessen wurde. Daraus resultiert dann die zweite - nicht so hilfreiche - Fehlermeldung. Außerdem wurde it nicht zuvor definiert (was ja der Fall sein müssen, wenn dort ein Ausdruck stünde) =&gt; Fehler Nr. 3. Danach gibt der Compiler offenbar auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2227422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227422</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 26 Jun 2012 15:09:58 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Klassen-Template on Wed, 27 Jun 2012 20:52:49 GMT]]></title><description><![CDATA[<p>Xarsis schrieb:</p>
<blockquote>
<p>Die nicht-Template Klasse SetOfFloats funktioniert einwandfrei, ...</p>
<pre><code class="language-cpp">/*
 * File:   SetOfFloats.h
 * Author: Prof. Dr. R. C. Moore (Fb I, h-da.de)
 *
 * Created on June 20, 2012, 8:22 PM
 */

#ifndef SETOFFLOATS_H
#define SETOFFLOATS_H

#include &lt;string&gt;
#include &lt;sstream&gt;
#include &lt;list&gt;

class SetOfFloats {
...
    // Diese Klasse soll (muss, darf) erweitert bzw. geändert werden.

};
</code></pre>
</blockquote>
<p>Hallo Xarsis,</p>
<p>allen Anschein nach ist das eine Klasse, die Dein Prof. Euch quasi als Referenz zur Verfügung gestellt hat. Die mag funktionieren, hat aber Verbesserdungsbedarf.<br />
nach <a href="http://www.addison-wesley.de/9783827330789.html" rel="nofollow">Scott Meyers 'Effektiv C++'</a> verstößt der Code gegen die Item<br />
4 - C-Kommentar<br />
12 - fehlende Initialisierungsliste<br />
21 - const correctness<br />
32 - Variablen so spät wie möglich deklarieren<br />
49 - mangelnde Kenntnis der C++-Standard-Library (sowohl bei remove, als auch bei to_string)<br />
nach <a href="http://www.addison-wesley.de/main/main.asp?page=home/bookdetails&amp;ProductID=7378" rel="nofollow">Scott Meyers 'Mehr Effektiv C++'</a> kommt noch dazu<br />
6 - Unterschied prefix und postfix operatoren</p>
<p>Jedes Item für sich ist vielleicht eine Kleinigkeit (obwohl - const correctness finde ich schon wichtig), aber alles zusammen, bei so wenig Code, lässt mangelnde Professionalität erkennen.</p>
<p>dazu kommen noch drei - ich sage mal - Stilbrüche<br />
- Verwendung von 'this-&gt;'<br />
- bool-Vergleich mit false<br />
- überflüssiger Destruktor</p>
<p>da kann man drüber diskutieren, müsste man aber gar nicht, wenn man es jeweils einfach weg gelassen hätte.</p>
<p>Irgendwie traurig, wenn so was an einer Uni oder FH gelehrt wird.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2227931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2227931</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 27 Jun 2012 20:52:49 GMT</pubDate></item></channel></rss>