<?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[Pointer auf Template-Klasse?]]></title><description><![CDATA[<p>Moin,<br />
ich komme bei einem Problem nicht weiter <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /><br />
Ich habe hier eine einfache Template-Klasse und möchte nun Pointer auf die Objekte dieser Klasse erstellen.</p>
<p>Das ist die Klasse:</p>
<pre><code>template&lt;class T&gt;
class TemplateClass
{
   vector&lt;T&gt;var;   
   //...
};
</code></pre>
<p>Und so definiere ich mir einen entsprechenden Vektor für die Pointer:</p>
<pre><code>vector&lt;TemplateClass*&gt;vec;
</code></pre>
<p>Im Laufe der Zeit sollen dann Objekte erstellt und die Pointer daraufhin in diesem Vektor gespeichert werden.</p>
<p>Das Problem ist aber, dass der DEV-C++ bereits bei der Definierung des Vektors angegeben haben will, welchen Typ ich verwende. Das kann ich aber erst bei der eigentlichen Erstellung des Objektes sagen.</p>
<p>Kann ich die Angabe des Typs jetzt irgendwie &quot;herauszögern&quot;, sodass ich ihn erst wirklich beim Erstellen des Objektes angeben muss.</p>
<p>Ooooder liege ich jetzt ganz falsch und interpretiere diese Fehlermeldung sogar verkehrt ôO:</p>
<blockquote>
<p>template argument 1 is invalid<br />
template argument 2 is invalid<br />
ISO C++ forbids declaration of `vec' with no type</p>
</blockquote>
<p>Ich hoffe ihr habt mich eingermaßen verstanden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/198212/pointer-auf-template-klasse</link><generator>RSS for Node</generator><lastBuildDate>Fri, 02 Oct 2026 04:20:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/198212.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 19 Nov 2007 17:09:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer auf Template-Klasse? on Mon, 19 Nov 2007 17:09:22 GMT]]></title><description><![CDATA[<p>Moin,<br />
ich komme bei einem Problem nicht weiter <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /><br />
Ich habe hier eine einfache Template-Klasse und möchte nun Pointer auf die Objekte dieser Klasse erstellen.</p>
<p>Das ist die Klasse:</p>
<pre><code>template&lt;class T&gt;
class TemplateClass
{
   vector&lt;T&gt;var;   
   //...
};
</code></pre>
<p>Und so definiere ich mir einen entsprechenden Vektor für die Pointer:</p>
<pre><code>vector&lt;TemplateClass*&gt;vec;
</code></pre>
<p>Im Laufe der Zeit sollen dann Objekte erstellt und die Pointer daraufhin in diesem Vektor gespeichert werden.</p>
<p>Das Problem ist aber, dass der DEV-C++ bereits bei der Definierung des Vektors angegeben haben will, welchen Typ ich verwende. Das kann ich aber erst bei der eigentlichen Erstellung des Objektes sagen.</p>
<p>Kann ich die Angabe des Typs jetzt irgendwie &quot;herauszögern&quot;, sodass ich ihn erst wirklich beim Erstellen des Objektes angeben muss.</p>
<p>Ooooder liege ich jetzt ganz falsch und interpretiere diese Fehlermeldung sogar verkehrt ôO:</p>
<blockquote>
<p>template argument 1 is invalid<br />
template argument 2 is invalid<br />
ISO C++ forbids declaration of `vec' with no type</p>
</blockquote>
<p>Ich hoffe ihr habt mich eingermaßen verstanden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1406039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1406039</guid><dc:creator><![CDATA[Eichboson]]></dc:creator><pubDate>Mon, 19 Nov 2007 17:09:22 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Template-Klasse? on Mon, 19 Nov 2007 17:15:51 GMT]]></title><description><![CDATA[<p>Hmm naja du kannst nur sowas machen:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class item
{
    std::vector&lt;T&gt; m_data;
};

template&lt;typename T&gt;
class container
{
    std::vector&lt;item&lt;T&gt;* &gt; m_items;
};
</code></pre>
<p>wenn du verschiedene Datentypen in den Vector packen willst, brauchst du boost::any ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1406047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1406047</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Mon, 19 Nov 2007 17:15:51 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Template-Klasse? on Mon, 19 Nov 2007 18:31:46 GMT]]></title><description><![CDATA[<p>Du müßtest eine abstrakte Basisklasse erstellen, von der dann deine Template-Klasse ableitet. Dann kannst du Zeiger darauf in den Container stecken und mittels Polymorphie auf die Inhalte der einzelnen Elemente zugreifen.</p>
<pre><code class="language-cpp">class Base
{
public:
  virtual ~Base() {}; // wichtig: virtueller Destruktor

  virtual void func(); // deine virtuellen Methoden
  // ...
};

template&lt;class T&gt;
class TemplateClass : public Base
{
   vector&lt;T&gt; var;
   //...
};

vector&lt;Base*&gt; vec;

vec.push_back(new TemplateClass&lt;int&gt;());
vec.push_back(new TemplateClass&lt;string&gt;());

vec[0]-&gt;func(); // rufe func für TemplateClass&lt;int&gt; auf
vec[1]-&gt;func(); // rufe func für TemplateClass&lt;string&gt; auf
</code></pre>
<p>Nicht vergessen, die Elemente beim Entfernen auch wieder zu löschen (mittels delete).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1406091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1406091</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Mon, 19 Nov 2007 18:31:46 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Template-Klasse? on Mon, 19 Nov 2007 21:24:40 GMT]]></title><description><![CDATA[<p>Th schrieb:</p>
<blockquote>
<p>Du müßtest eine abstrakte Basisklasse erstellen, von der dann deine Template-Klasse ableitet. Dann kannst du Zeiger darauf in den Container stecken und mittels Polymorphie auf die Inhalte der einzelnen Elemente zugreifen.</p>
<pre><code class="language-cpp">class Base
{
public:
  virtual ~Base() {}; // wichtig: virtueller Destruktor

  virtual void func(); // deine virtuellen Methoden
  // ...
};

template&lt;class T&gt;
class TemplateClass : public Base
{
   vector&lt;T&gt; var;
   //...
};

vector&lt;Base*&gt; vec;

vec.push_back(new TemplateClass&lt;int&gt;());
vec.push_back(new TemplateClass&lt;string&gt;());

vec[0]-&gt;func(); // rufe func für TemplateClass&lt;int&gt; auf
vec[1]-&gt;func(); // rufe func für TemplateClass&lt;string&gt; auf
</code></pre>
<p>Nicht vergessen, die Elemente beim Entfernen auch wieder zu löschen (mittels delete).</p>
</blockquote>
<p>Hmmm...gute Idee. Aber ich habe in meiner Template-Klasse ein paar Funktionen, die T als Übergabeparameter, als auch welche die T als Rückgabewert haben. Die kann ich dann ja nicht so ohne weiteres in die Basisklasse packen... Oder gibt's da vll. doch ne Möglichkeit?</p>
<p>@(D)Evil: Hmmm....da werd ich wohl mal ne Weile nach boost:: googeln müssen. Die Methode von Th wäre mir aber lieber, da sie auch noch das ein oder andere Problemchen mehr lösen würde...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1406242</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1406242</guid><dc:creator><![CDATA[Eichboson]]></dc:creator><pubDate>Mon, 19 Nov 2007 21:24:40 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Template-Klasse? on Tue, 20 Nov 2007 00:13:25 GMT]]></title><description><![CDATA[<blockquote>
<p>Die kann ich dann ja nicht so ohne weiteres in die Basisklasse packen... Oder gibt's da vll. doch ne Möglichkeit?</p>
</blockquote>
<p>Lol, nein. Wie stellst du dir das vor?<br />
C++ ist statisch typisiert, da geht sowas nicht.<br />
In Python o.ä. kein Problem, in C++ unmöglich.<br />
Es gibt zwar einge Abscheulichkeiten wie boost::any, aber mit sowas sollte man IMO nicht arbeiten solange nicht feststeht dass es keinen anderen, besseren Weg gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1406299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1406299</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 20 Nov 2007 00:13:25 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Template-Klasse? on Thu, 22 Nov 2007 09:20:57 GMT]]></title><description><![CDATA[<p>Natürlich geht es (auch ohne boost::any). Und zwar mit den guten alten perversen void-Pointern. Dann kannst alles in den Vector hängen und entsprechend damit arbeiten. Oder eben die Basisklasse die eine Funktion hat die den jeweiligen Typ (als enum oder sowas) zurückgibst, die du jeweils überschreibst für die einzelnen Klassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1407961</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1407961</guid><dc:creator><![CDATA[Uwe234123]]></dc:creator><pubDate>Thu, 22 Nov 2007 09:20:57 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Template-Klasse? on Thu, 22 Nov 2007 11:04:22 GMT]]></title><description><![CDATA[<p>Und wie soll man bei &quot;void *&quot; dann wissen, was dahinter steht?<br />
Nur etwas in einen Container zu packen, ohne damit arbeiten zu können, macht wohl keinen Sinn...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1408045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408045</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Thu, 22 Nov 2007 11:04:22 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Template-Klasse? on Thu, 22 Nov 2007 11:30:45 GMT]]></title><description><![CDATA[<p>Wenn dein Klassentemplate nur mit einer absehbaren Menge von Typen instantiiert und in den vector gepackt werden soll (z.B. nur int, double, char und std::string), kann man etwas wie folgt machen:</p>
<pre><code class="language-cpp">class Base {
public:
  explicit virtual double      foo(double x)      {throw std::bad_cast;}
  explicit virtual int         foo(int x)         {throw std::bad_cast;}
  explicit virtual std::string foo(std::string x) {throw std::bad_cast;}
  explicit virtual char        foo(char x)        {throw std::bad_cast;}

  ~Base() {} =0; //pure virtual dtor 
};

template&lt;class T&gt;
class MyClass : public Base {
public:
  virtual T foo(T x) { myvec.push_back(x);}
  ~MyClass() {};
private:
  std::vector&lt;T&gt; myvec;
};
</code></pre>
<p>Und in der Verwendung dann wie gehabt einen vector&lt;Base*&gt; in den du Pointer auf die MyClass&lt;T&gt;'s steckst. Was passiert ist folgendes: du kannst foo fuer <em>jede beliebige</em> Instantiierung von MyClass aufrufen, ueber Base pointer aber nur die, die du dort auch deklariert hast (das explicit verhindert, das implizite Konvertierungen z.B. von short int nach int stattfinden). Bsp:</p>
<pre><code class="language-cpp">class A {};

int main() {
  A a;
  char b;
  int c;

  MyClass&lt;A&gt; xa;
  MyClass&lt;char&gt; xb;
  MyClass&lt;int&gt; xc;
  Base* pa = &amp;xa;
  Base* pb = &amp;xb;
  Base* pc = &amp;xc;

  xa.foo(a); //funktioniert
  xb.foo(b); //tuts auch
  xc.foo(c); //kein problem
  xc.foo(b); //!implizite konvertierung von char nach int!

  pa-&gt;foo(a); //FEHLER, Base::foo(A) gibts nicht!
  pb-&gt;foo(b); //geht
  pc-&gt;foo(c); //geht auch

  pc-&gt;foo(b); //wird ausgefuehrt und fuehrt zu einem std::bad_cast,
              //weil MyClass&lt;int&gt; nur foo(int) ueberladen hat, es wird aber foo(char) aufgerufen!

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1408060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408060</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 22 Nov 2007 11:30:45 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Template-Klasse? on Thu, 22 Nov 2007 13:09:00 GMT]]></title><description><![CDATA[<p>Nachtrag: bei der von mir vorgestellten Technik ist die Zahl der Funktionsdeklarationen in Base gleich der Zahl der T-unabhaengigen Methoden in MyClass plus die Zahl der T-anhaengigen Methoden mal die Zahl der &quot;erlaubten&quot; Typen, was recht schnell viel werden kann. Mir ist grad beim Mittagessen noch eine andere Variante eingefallen:</p>
<pre><code class="language-cpp">template &lt;class T&gt; class MyClass; //forward-deklaration

class Base {
public:
  virtual void bar() = 0; //typunabhaengig
  template&lt;class T&gt;
  T foo(ccnst T&amp; x);             //typabhaengige methode

  virtual ~Base() = 0;
private: 
  template&lt;class T&gt;
  MyClass&lt;T&gt;* TemplateIs(const T&amp; /*t*/ = T());
};

template&lt;class T&gt;
class MyClass {
public:
  virtual void bar() {/* machwas */}
  T foo(const T&amp; x) {/* mach was mit T */}
  virtual ~Base() {};
}

template&lt;class T&gt;
MyClass&lt;T&gt;* Base::TemplateIs(const T&amp; /*t*/) { 
  return dynamic_cast&lt;T&gt;(this); 
}

template&lt;class T&gt;
T Base::foo(const T&amp; x) {
  if (MyClass&lt;T&gt;* pt = TemplateIs&lt;T&gt;()) {
    return pt-&gt;foo(x);
  }
  else throw std::bad_cast;
}

/* alternativ:
 *
 * template&lt;class T&gt;
 * T Base::foo(const T&amp; x) {
 *   return TemplateIs&lt;T&gt;-&gt;foo(x);
 * }
 */
</code></pre>
<p>alternativ kann man die Sicherheitsabfrage aus foo weglassen und es dem Client ueberlassen, den richtigen Typ zu mittels TemplateIs() pruefen und entsprechend zu reagieren. In jedem Fall muss man aber voher schon wissen, auf welche Instantiierung von MyClass ein Base-pointer zeigt, wenn man die entsprechenden Operationen ausfuehren will (die typunabhaengigen gehn immer)</p>
<pre><code class="language-cpp">class B {};
int main() {
  MyClass&lt;int&gt; xa;
  MyClass&lt;B&gt; xb;
  MyClass&lt;char&gt; xc;

  Base* pa = &amp;xa;
  Base* pb = &amp;xb;

  char c;
  std::vector&lt;Base*&gt; vec;

  vec.push_back(&amp;xa);
  vec.push_back(&amp;xb);
  vec.push_back(&amp;xc);

  for(std::vector&lt;Base*&gt;::iterator it = vec.begin(), it != vec.end(), ++it)
    it-&gt;bar();

  cout &lt;&lt; xc.foo(c) &lt;&lt;endl; 
  cout &lt;&lt; pa-&gt;foo(c) &lt;&lt; endl;  //wirft std::bad_cast wenn wie oben implementiert, sonst segfault wenn Alternative (Zugriff ueber nullpointer)
  if(pb-&gt;TemplateIs(c))  //liefert nullpointer == false
    cout &lt;&lt; pb-&gt;foo(c);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1408124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1408124</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 22 Nov 2007 13:09:00 GMT</pubDate></item></channel></rss>