<?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[Templateklasse verwenden]]></title><description><![CDATA[<p>Hallo!<br />
Follgendes Problem.</p>
<p>Ich versuche eine Hashtabelle zu programmieren. Ich bekomme eine Fehlermeldung<br />
<strong>error C2955: &quot;HashElement&quot;: Für die Verwendung der template-Klasse ist eine template-Argumentliste erforderlich.</strong></p>
<p>Es ist mir schon klar dass ich sagen muss von welchem Type soll mein <strong>ListElement</strong> sein. Type ist aber variabel... Hat jem ne Idee?</p>
<p>Danke schon mal.</p>
<p><em><strong>HashElement.h</strong></em></p>
<pre><code class="language-cpp">#ifndef __HASHELEMENT__INCLUDED__
#define __HASHELEMENT__INCLUDED__

#include &lt;string&gt;

using namespace std;

template &lt;typename T&gt;
class HashElement {

public:
  string    key;
  T         value;
  int		hashValue;

  /**
  * Konstruktor.
  */
  HashElement(string key, T value, int hashValue){
	this-&gt;key		= key;
	this-&gt;value		= value;
	this-&gt;hashValue         = hashValue;
  }

};

#endif
</code></pre>
<p><em><strong>Hashtable.h</strong></em><br />
Zeile 14 Fehlermedung.</p>
<pre><code class="language-cpp">#ifndef __HASHTABLE__INCLUDED__
#define __HASHTABLE__INCLUDED__

#include &lt;list&gt;
#include &quot;HashElement.h&quot;

using namespace std;

class Hashtable {

private:
  /** Array mit Listen */
  list&lt;HashElement&gt;* table;  //HIER FEHLER!

  /** Laenge des Arrays */
  int size;								

  /**
  * Ermittelt einen Hashwert aus einem Key
  * @return hashcode
  */
  int hashcode(string key);

public:
	Hashtable(int nsize);
	~Hashtable();
        ...

};

#endif
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/256556/templateklasse-verwenden</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 05:31:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/256556.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 14 Dec 2009 21:05:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Templateklasse verwenden on Mon, 14 Dec 2009 21:05:57 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Follgendes Problem.</p>
<p>Ich versuche eine Hashtabelle zu programmieren. Ich bekomme eine Fehlermeldung<br />
<strong>error C2955: &quot;HashElement&quot;: Für die Verwendung der template-Klasse ist eine template-Argumentliste erforderlich.</strong></p>
<p>Es ist mir schon klar dass ich sagen muss von welchem Type soll mein <strong>ListElement</strong> sein. Type ist aber variabel... Hat jem ne Idee?</p>
<p>Danke schon mal.</p>
<p><em><strong>HashElement.h</strong></em></p>
<pre><code class="language-cpp">#ifndef __HASHELEMENT__INCLUDED__
#define __HASHELEMENT__INCLUDED__

#include &lt;string&gt;

using namespace std;

template &lt;typename T&gt;
class HashElement {

public:
  string    key;
  T         value;
  int		hashValue;

  /**
  * Konstruktor.
  */
  HashElement(string key, T value, int hashValue){
	this-&gt;key		= key;
	this-&gt;value		= value;
	this-&gt;hashValue         = hashValue;
  }

};

#endif
</code></pre>
<p><em><strong>Hashtable.h</strong></em><br />
Zeile 14 Fehlermedung.</p>
<pre><code class="language-cpp">#ifndef __HASHTABLE__INCLUDED__
#define __HASHTABLE__INCLUDED__

#include &lt;list&gt;
#include &quot;HashElement.h&quot;

using namespace std;

class Hashtable {

private:
  /** Array mit Listen */
  list&lt;HashElement&gt;* table;  //HIER FEHLER!

  /** Laenge des Arrays */
  int size;								

  /**
  * Ermittelt einen Hashwert aus einem Key
  * @return hashcode
  */
  int hashcode(string key);

public:
	Hashtable(int nsize);
	~Hashtable();
        ...

};

#endif
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1822542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822542</guid><dc:creator><![CDATA[Dit_]]></dc:creator><pubDate>Mon, 14 Dec 2009 21:05:57 GMT</pubDate></item><item><title><![CDATA[Reply to Templateklasse verwenden on Mon, 14 Dec 2009 21:12:44 GMT]]></title><description><![CDATA[<p>Du brauchst dort so etwas:</p>
<pre><code class="language-cpp">list&lt;HashElement&lt;int&gt; &gt;* table;
</code></pre>
<p>HashElement ist bei dir ja auch ein Template. Also musst du da auch einen Typen angeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822545</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 14 Dec 2009 21:12:44 GMT</pubDate></item><item><title><![CDATA[Reply to Templateklasse verwenden on Mon, 14 Dec 2009 21:17:11 GMT]]></title><description><![CDATA[<p>Dit_ schrieb:</p>
<blockquote>
<p><strong>error C2955: &quot;HashElement&quot;: Für die Verwendung der template-Klasse ist eine template-Argumentliste erforderlich.</strong></p>
</blockquote>
<p>Ist eigentlich recht eindeutig. HashElement ist selbst eine Vorlagenklasse und muss bei Verwendung mit einem Template-Argument versehen werden:</p>
<pre><code class="language-cpp">HashElement&lt; int &gt;
// ---&gt;
std::list&lt; HashElement&lt; int &gt; &gt; ...
</code></pre>
<p>Dit_ schrieb:</p>
<blockquote>
<p>Es ist mir schon klar dass ich sagen muss von welchem Type soll mein <strong>ListElement</strong> sein. Type ist aber variabel... Hat jem ne Idee?</p>
</blockquote>
<p>Virtuelle Basisklasse und Zeiger</p>
<p>Aus einem Template werden je Argument eigenständige Klassen generiert. Mit Templates erreichst du nicht die &quot;Variabilität&quot;, welche du dir (vielleicht) vorstellst.</p>
<p>Dit_ schrieb:</p>
<blockquote>
<p><em><strong>HashElement.h</strong></em></p>
<pre><code class="language-cpp">#ifndef __HASHELEMENT__INCLUDED__
#define __HASHELEMENT__INCLUDED__

#include &lt;string&gt;

using namespace std;
...
</code></pre>
</blockquote>
<p>Zwei Dinge:</p>
<ul>
<li>Keine führenden Unterstriche in Makrodefinitionen, diese sind für den Compiler reserviert.</li>
<li>Niemals <strong>using</strong> in Headerdateien verwenden. Dieses versaut dir sonst den Namensraum. In der Definition (.cpp) ist das kein Problem.</li>
</ul>
<p>Grüße ... Heiko</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822548</guid><dc:creator><![CDATA[bwbg]]></dc:creator><pubDate>Mon, 14 Dec 2009 21:17:11 GMT</pubDate></item><item><title><![CDATA[Reply to Templateklasse verwenden on Mon, 14 Dec 2009 21:17:21 GMT]]></title><description><![CDATA[<p>ja aber dann entscheide ich mich ja für einen Datentyp. <strong>table</strong> soll aus verschiedenen ListElementen-Datentypen bestehen. Sprich ich kann ListElement als <em>double</em> anhängen und dann sofort als <em>int</em> oder als <em>meinKlass</em>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822549</guid><dc:creator><![CDATA[Dit_]]></dc:creator><pubDate>Mon, 14 Dec 2009 21:17:21 GMT</pubDate></item><item><title><![CDATA[Reply to Templateklasse verwenden on Mon, 14 Dec 2009 21:20:10 GMT]]></title><description><![CDATA[<p>Dit_ schrieb:</p>
<blockquote>
<p>Es ist mir schon klar dass ich sagen muss von welchem Type soll mein <strong>ListElement</strong> sein. Type ist aber variabel...</p>
</blockquote>
<p>Ein statischer Typ ist in C++ niemals variabel.</p>
<p>Gib bei dir an, mit welchem Templateargument du dein Klassentemplate <code>HashElement</code> instanziieren willst, beispielsweise:</p>
<pre><code class="language-cpp">std::list&lt;HashElement&lt;int&gt; &gt; table; // Abstand zwischen &gt; und &gt;
</code></pre>
<p>Andere Anmerkungen:</p>
<ul>
<li>Was bringt der Zeiger auf <code>std::list</code> ? Arbeite lieber mit automatischen Objekten, sofern möglich.</li>
<li>Benutze kein <code>using namespace</code> in Headerdateien, da der Namensraum in allen inkludierenden Dateien so irreversibel offengelegt wird.</li>
<li>Bezeichner, die zwei Unterstriche enthalten oder mit Unterstrich und Grossbuchstaben beginnen, sind für Compiler und Implementierung reserviert. Das betrifft deine Include-Guards.</li>
<li>Verwende im Konstruktor die Initialisierungsliste.</li>
<li>Ziehe Const-Referenzen Value-Parametern vor, sofern möglich (betrifft <code>int Hashtable::hashcode(std::string key)</code> )</li>
<li>Halte dich an die <em>Regel der Grossen Drei</em>: Sobald du den Destruktor implementierst, solltest du Kopierkonstruktor und Zuweisungsoperator ebenfalls definieren. In sehr vielen Fällen ist eine spezielle Kopiersemantik jedoch unnötig.</li>
</ul>
]]></description><link>https://www.c-plusplus.net/forum/post/1822550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822550</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 14 Dec 2009 21:20:10 GMT</pubDate></item><item><title><![CDATA[Reply to Templateklasse verwenden on Mon, 14 Dec 2009 21:22:53 GMT]]></title><description><![CDATA[<p>ok danke für die Tipps <strong>bwbg</strong> &amp; <strong>Nexus</strong> <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822553</guid><dc:creator><![CDATA[Dit_]]></dc:creator><pubDate>Mon, 14 Dec 2009 21:22:53 GMT</pubDate></item><item><title><![CDATA[Reply to Templateklasse verwenden on Tue, 15 Dec 2009 21:27:39 GMT]]></title><description><![CDATA[<p>ok nächste Frage <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="🙂"
    /></p>
<p>Weiss nicht genau wie ich Konstruktor implementiere. Es soll eine Hashtabelle mit einer bestimmten Startgröße erstellt werden.<br />
Ich brauche ja ein Array dafür. Jedes Mitgleid soll eine liste vom Typ HashElement sein.</p>
<p>Wie erstelle ich so ein Array richtig?</p>
<p>Danke schon mal.</p>
<pre><code class="language-cpp">#ifndef HASHTABLE
#define HASHTABLE

#include &lt;list&gt;
#include &quot;HashElement.h&quot;

template &lt;typename T&gt;
class Hashtable {

private:

  list&lt; HashElement&lt;T&gt; &gt;* table;

  int size;								

  /**
  * Ermittelt einen Hashwert aus einem Key
  * @return hashcode
  */
  int hashcode(string key){

       //kommt noch...

	return hash;
  }

public:
	/** Konstruktor. */
	Hashtable(int nsize){
		this-&gt;size  = nsize;
		this-&gt;table = new table[this-&gt;size]; // falsh oder ?
	}

	/** Destruktor. */
	~Hashtable(){ 
		delete[] table;
	}

  /*********** PUT ***********/
  void put(string key, T value){
	// 
  }

  /*********** GET ***********/
  T get(string key){
        //
	  return NULL;
  }

};

#endif
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1823171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823171</guid><dc:creator><![CDATA[Dit_]]></dc:creator><pubDate>Tue, 15 Dec 2009 21:27:39 GMT</pubDate></item><item><title><![CDATA[Reply to Templateklasse verwenden on Wed, 16 Dec 2009 08:26:15 GMT]]></title><description><![CDATA[<p>Du könntest std::vector benutzen, statt eines raw arrays, das erspart dir die dynamische Speicherverwaltung und das Umkopieren beim Ändern der Tabellengrösse:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class Hashtable
{
public:
   // typedefs für bessere Lesbarkeit
   typedef std::list&lt;HashElement&lt;T&gt; &gt; list_type;
   typedef std::vector&lt;list_type&gt;     container_type;

private:
   container_type    Elements_;

public:
   // reserviere 101 Elemente im Vektor
   Hashtable() : Elements_( 101 )
   {
   }

   ...

private:
   void resize( unsigned int Size )
   {
      // Vektorgrösse setzen
      Elements_.resize( Size );
   }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1823308</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823308</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Wed, 16 Dec 2009 08:26:15 GMT</pubDate></item><item><title><![CDATA[Reply to Templateklasse verwenden on Wed, 16 Dec 2009 23:07:12 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">list&lt; HashElement&lt;T&gt; &gt;* table;
</code></pre>
<p>Nexus schrieb:</p>
<blockquote>
<ul>
<li>Was bringt der Zeiger auf <code>std::list</code> ? Arbeite lieber mit automatischen Objekten, sofern möglich.</li>
</ul>
</blockquote>
<pre><code class="language-cpp">int hashcode(string key)
</code></pre>
<p>Nexus schrieb:</p>
<blockquote>
<ul>
<li>Ziehe Const-Referenzen Value-Parametern vor, sofern möglich (betrifft <code>int Hashtable::hashcode(std::string key)</code> )</li>
</ul>
</blockquote>
<pre><code class="language-cpp">/** Konstruktor. */
    Hashtable(int nsize){
        this-&gt;size  = nsize;
        this-&gt;table = new table[this-&gt;size]; // falsh oder ?
    }
</code></pre>
<p>Nexus schrieb:</p>
<blockquote>
<ul>
<li>Verwende im Konstruktor die Initialisierungsliste.</li>
</ul>
</blockquote>
<p>Nach dem Berücksichtigen meiner Vorschläge kannst du auch mal den <a href="http://magazin.c-plusplus.net/artikel/Aufbau%20der%20STL%20-%20Teil%201%3A%20Container" rel="nofollow">STL-Artikel</a> lesen. Vielleicht wäre ein gutes Buch, das Konstruktoren und solche Grundlagen erklärt, auch nicht allzu schlecht... <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/1823787</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823787</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 16 Dec 2009 23:07:12 GMT</pubDate></item></channel></rss>