<?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[Typename bei Template-Klasse]]></title><description><![CDATA[<p>Hallo Community<br />
Ich habe ein template mit einem 'typename'Parameter</p>
<pre><code class="language-cpp">template &lt;typename Inlay_Type&gt;
class xy
{
   // Inhalt der Template Klasse
};
</code></pre>
<p>In den Inlay_Type werden sowohl Standard-Typen(int, double etc. hinterlegt). Aber auch eigene Datentypen. Sowohl auf Zeiger- als auch auf Nicht-Zeiger-Basis.</p>
<p>Das Problem was sich mir im Moment stellt ist folgendes:<br />
Ich setze 'Inlay_Type' typename auf 'meineEigeneKlasse*'. Was kein Problem ist. Allerdings ist es nötig innerhalb des Templates neue Objecte von 'meineEigeneKlasse' zu erstellen. Dafür habe ich ein Standardobject 'initObj' welches eine 'meineEigeneKlasse'-Object beinhaltet (mit Standard-einstellungen).</p>
<p>Ich will dann innerhalb des Templates ein neues Object mit dem Inhalt des 'initObj' erzeugen.</p>
<pre><code class="language-cpp">Inlay_Type t = new Inlay_Type(*initObj);

// was natürlich ausgeschrieben heißt :
meineEigeneKlasse* t = new meineEigeneKlasse*();
</code></pre>
<p>Meine Frage ist nun ist es möglich das ich ein neues Object im Template erzeuge ohne:</p>
<p>- Ohne das ich eine Copy-C'tor alle meineEigeneKlasse(meineEigeneKlasse*) verwende der mir ein neues Obj erstellt<br />
- Ohne das ich den Oerator '=' von 'meineEigeneKlasse' überschreibe das dieser mir das AlteObj in ein neues legt<br />
- Ohne das ich einen zweiten Template-Parameter einführe.<br />
- Ohne das ich den ersten Template-Parameter ohne '*' übergebe und den Stern halt nur da hinzufüge wo ich ihn brauche.</p>
<p>Idealer weise wär es natürlich wenn man beim 'typename' einfach das * wegzaubern könnte. Aber das funzt ja net soweit ich weis.</p>
<p>Vielen Dank für alle Anregungen, und einen schönen start ins Wochende...</p>
<p>Gruß Ollow</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/281592/typename-bei-template-klasse</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 13:04:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/281592.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 04 Feb 2011 14:48:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Typename bei Template-Klasse on Fri, 04 Feb 2011 14:50:06 GMT]]></title><description><![CDATA[<p>Hallo Community<br />
Ich habe ein template mit einem 'typename'Parameter</p>
<pre><code class="language-cpp">template &lt;typename Inlay_Type&gt;
class xy
{
   // Inhalt der Template Klasse
};
</code></pre>
<p>In den Inlay_Type werden sowohl Standard-Typen(int, double etc. hinterlegt). Aber auch eigene Datentypen. Sowohl auf Zeiger- als auch auf Nicht-Zeiger-Basis.</p>
<p>Das Problem was sich mir im Moment stellt ist folgendes:<br />
Ich setze 'Inlay_Type' typename auf 'meineEigeneKlasse*'. Was kein Problem ist. Allerdings ist es nötig innerhalb des Templates neue Objecte von 'meineEigeneKlasse' zu erstellen. Dafür habe ich ein Standardobject 'initObj' welches eine 'meineEigeneKlasse'-Object beinhaltet (mit Standard-einstellungen).</p>
<p>Ich will dann innerhalb des Templates ein neues Object mit dem Inhalt des 'initObj' erzeugen.</p>
<pre><code class="language-cpp">Inlay_Type t = new Inlay_Type(*initObj);

// was natürlich ausgeschrieben heißt :
meineEigeneKlasse* t = new meineEigeneKlasse*();
</code></pre>
<p>Meine Frage ist nun ist es möglich das ich ein neues Object im Template erzeuge ohne:</p>
<p>- Ohne das ich eine Copy-C'tor alle meineEigeneKlasse(meineEigeneKlasse*) verwende der mir ein neues Obj erstellt<br />
- Ohne das ich den Oerator '=' von 'meineEigeneKlasse' überschreibe das dieser mir das AlteObj in ein neues legt<br />
- Ohne das ich einen zweiten Template-Parameter einführe.<br />
- Ohne das ich den ersten Template-Parameter ohne '*' übergebe und den Stern halt nur da hinzufüge wo ich ihn brauche.</p>
<p>Idealer weise wär es natürlich wenn man beim 'typename' einfach das * wegzaubern könnte. Aber das funzt ja net soweit ich weis.</p>
<p>Vielen Dank für alle Anregungen, und einen schönen start ins Wochende...</p>
<p>Gruß Ollow</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2016555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2016555</guid><dc:creator><![CDATA[Ollow_AM]]></dc:creator><pubDate>Fri, 04 Feb 2011 14:50:06 GMT</pubDate></item><item><title><![CDATA[Reply to Typename bei Template-Klasse on Fri, 04 Feb 2011 15:06:52 GMT]]></title><description><![CDATA[<p>Ollow_AM schrieb:</p>
<blockquote>
<p>Idealer weise wär es natürlich wenn man beim 'typename' einfach das * wegzaubern könnte. Aber das funzt ja net soweit ich weis.</p>
</blockquote>
<p>Gewissermaßen doch: Du kannst eine Spezialisierung für sämtliche Pointertypen schreiben. Ungefähr so:</p>
<pre><code class="language-cpp">template &lt;typename T&gt; class foo
{
public:
  void A()
  {
    cout&lt;&lt;&quot;Gleich für alle Typen&quot;&lt;&lt;endl;
  }
  void B()
  {
    cout&lt;&lt;&quot;Speziell für Nicht-Pointer&quot;&lt;&lt;endl;
  }
};

template &lt;typename T&gt; class foo&lt;T*&gt; : public foo&lt;T&gt;
{
public:
  void B()
  {
    cout&lt;&lt;&quot;Speziell für Pointer&quot;&lt;&lt;endl;
  }
};

int main()
{
  foo&lt;int&gt; bar;
  foo&lt;int*&gt; pbar;
  bar.A(); bar.B();
  pbar.A(); pbar.B();
}
</code></pre>
<p>Ich hoffe ich habe dich richtig verstanden, dass es dies ist, was du willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2016564</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2016564</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 04 Feb 2011 15:06:52 GMT</pubDate></item><item><title><![CDATA[Reply to Typename bei Template-Klasse on Mon, 07 Feb 2011 07:50:40 GMT]]></title><description><![CDATA[<p>Servus, und erstmal sorry für die späte Antwort.</p>
<p>Hmm, ja diese Form der Spezialisierung habe ich bereits. Dennoch stoße ich leider innerhalb des Templates auf das geschilderte Problem.</p>
<p>Um bei deinen Beispiel zu bleiben</p>
<pre><code class="language-cpp">template &lt;typename T&gt; class foo&lt;T*&gt; : public foo&lt;T&gt;
{
public:
  void B()
  {
    cout&lt;&lt;&quot;Speziell für Pointer&quot;&lt;&lt;endl;
    T newObj = new T(*initObj); // &lt;-- hier dann nach wie vor das Probelm
  }
};
</code></pre>
<p>An obiger Stelle habe ich dann das Problem, wenn ich ein neues Object des Typen<br />
erstellen will. Denn im Klartext habe ich ja z.B. im Quellcode stehen</p>
<pre><code>int* t = new int*(*initObj);
</code></pre>
<p>Womit ja eine 'int**' erhalte. Da ich ja nicht weiß was für einen Typen ich in das Template bekomme, müsste ich ja über 'typinfo' und 'typeid(T).name()' abfragen welchen Type ich habe damit ich in einer z.B. einer If-Abfrage welchen Type er nehmen soll etwa so in der Art..</p>
<pre><code class="language-cpp">template &lt;typename T&gt; class foo&lt;T*&gt; : public foo&lt;T&gt;
{
public:
  void B()
  {
    cout&lt;&lt;&quot;Speziell für Pointer&quot;&lt;&lt;endl;
    wxString typname = typeid(T).name();
    if (typename.IsSameAs(_T(&quot;int*&quot;))) 
    {
        T newObj = new int(*initObj);
    }
    else if (typename.IsSameAs(_T(&quot;eigeneKlasse*&quot;))) 
         {
             T newObj = new eigeneKlasse(*initObj);
         }
   // usw. für andere Typen
  }
};
</code></pre>
<p>Wäre aber eine unschöne Lösung meiner Meinung nach. Darum meine Hoffnung das es vielleicht doch eine Möglichkeit gegeben hätte beim 'typename' einfach das '*' wegzubekommen. Naja werde mal noch ein wenig in den MSDN-Seiten suchen. Ansonsten muss ich mir wohl doch überlegen den Typen ohne den *-Operator zu übergeben.</p>
<p>Aber vielen Dank für die Antwort...<br />
Mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2017656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2017656</guid><dc:creator><![CDATA[Ollow_AM]]></dc:creator><pubDate>Mon, 07 Feb 2011 07:50:40 GMT</pubDate></item><item><title><![CDATA[Reply to Typename bei Template-Klasse on Mon, 07 Feb 2011 10:39:20 GMT]]></title><description><![CDATA[<p>Ohne Dein Problem jetzt komplett verstanden zu haben, vielleicht hilft Dir ja <code>remove_pointer&lt; T &gt;</code> weiter aus boost.type_traits weiter.</p>
<pre><code class="language-cpp">typedef remove_pointer&lt; int* &gt;::type my_int;
typedef remove_pointer&lt; int &gt;::type my_int2;
</code></pre>
<p><code>my_int</code> und <code>my_int2</code> sind jetzt die gleichen Typen, nämlich ganz normale Integer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2017719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2017719</guid><dc:creator><![CDATA[headmyshoulder]]></dc:creator><pubDate>Mon, 07 Feb 2011 10:39:20 GMT</pubDate></item><item><title><![CDATA[Reply to Typename bei Template-Klasse on Mon, 07 Feb 2011 11:04:55 GMT]]></title><description><![CDATA[<p>Ja sowas habe ich gesucht. Besten Dank.</p>
<p>Bekomm jetzt zwar den C1189 - Error. Aber hab jetzt mal einen Ansatzpunkt. Da suchen ma mal was Google und das Forum dazu ausspuckt.</p>
<p>Erstmal besten Dank.. <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/2017733</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2017733</guid><dc:creator><![CDATA[Ollow_AM]]></dc:creator><pubDate>Mon, 07 Feb 2011 11:04:55 GMT</pubDate></item><item><title><![CDATA[Reply to Typename bei Template-Klasse on Mon, 07 Feb 2011 14:41:28 GMT]]></title><description><![CDATA[<p>Du musst hier natürlich auch typename verwenden. VC++ treibt da leider ziemlich krumme Dinge mit typename.</p>
<pre><code class="language-cpp">typedef typename remove_pointer&lt;T*&gt;::type my_type;
</code></pre>
<p>Sowas selbst zu bauen ist aber auch relativ einfach:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
struct remove_pointer
{
	typedef T type;
};

template &lt;typename T&gt;
struct remove_pointer&lt;T*&gt;
{
	typedef T type;
};
</code></pre>
<p>(ungetestet, sollte aber so funzen) <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/2017822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2017822</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Mon, 07 Feb 2011 14:41:28 GMT</pubDate></item><item><title><![CDATA[Reply to Typename bei Template-Klasse on Mon, 07 Feb 2011 14:46:47 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Du musst hier natürlich auch typename verwenden. VC++ treibt da leider ziemlich krumme Dinge mit typename.</p>
</blockquote>
<p>Naja, innerhalb eines Templates muss dass typename da hin, ansonsten natürlich nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2017830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2017830</guid><dc:creator><![CDATA[headmyshoulder]]></dc:creator><pubDate>Mon, 07 Feb 2011 14:46:47 GMT</pubDate></item><item><title><![CDATA[Reply to Typename bei Template-Klasse on Mon, 07 Feb 2011 14:47:51 GMT]]></title><description><![CDATA[<p>headmyshoulder schrieb:</p>
<blockquote>
<p>314159265358979 schrieb:</p>
<blockquote>
<p>Du musst hier natürlich auch typename verwenden. VC++ treibt da leider ziemlich krumme Dinge mit typename.</p>
</blockquote>
<p>Naja, innerhalb eines Templates muss dass typename da hin, ansonsten natürlich nicht.</p>
</blockquote>
<p>Jo, klar <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/2017831</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2017831</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Mon, 07 Feb 2011 14:47:51 GMT</pubDate></item><item><title><![CDATA[Reply to Typename bei Template-Klasse on Mon, 07 Feb 2011 21:19:14 GMT]]></title><description><![CDATA[<p>Ollow_AM schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template &lt;typename T&gt; class foo&lt;T*&gt; : public foo&lt;T&gt;
{
public:
  void B()
  {
    cout&lt;&lt;&quot;Speziell für Pointer&quot;&lt;&lt;endl;
    wxString typname = typeid(T).name();
    if (typename.IsSameAs(_T(&quot;int*&quot;))) 
    {
        T newObj = new int(*initObj);
    }
    else if (typename.IsSameAs(_T(&quot;eigeneKlasse*&quot;))) 
         {
             T newObj = new eigeneKlasse(*initObj);
         }
   // usw. für andere Typen
  }
};
</code></pre>
<p>Wäre aber eine unschöne Lösung meiner Meinung nach. Darum meine Hoffnung das es vielleicht doch eine Möglichkeit gegeben hätte beim 'typename' einfach das '*' wegzubekommen.</p>
</blockquote>
<p>Verstehe gerade das Problem nicht. In der Spezialisierung &quot;T*&quot; steht T ja nicht mehr für den Zeiger Typ (&quot;eigeneKlasse*&quot;), sondern nur mehr für den Typ (&quot;eigeneKlasse&quot;).<br />
Demzufolge muss/kann der Code auch so aussehen:</p>
<pre><code class="language-cpp">template &lt;typename T&gt; class foo&lt;T*&gt; : public foo&lt;T&gt;
{
public:
  void B()
  {
    cout&lt;&lt;&quot;Speziell für Pointer&quot;&lt;&lt;endl;

    T* newObj = new T(*initObj);
  }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2017999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2017999</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 07 Feb 2011 21:19:14 GMT</pubDate></item><item><title><![CDATA[Reply to Typename bei Template-Klasse on Tue, 08 Feb 2011 07:06:14 GMT]]></title><description><![CDATA[<p>@ 314159265358979 :<br />
Jap wunderbar, der Code funzt einwandfrei. Weil die 'std::tr1::remove_pointer' wollte er nicht. Besten Dank....</p>
<p>@ hustbaer:<br />
Jap aber nur solange keiner versucht das Template mit einen 'eigeneKlasse*' zu füttern.</p>
<p>Aber mit den dem 'remove_pointer' funktionen klappt das ja jetzt einwandfrei.</p>
<p>Besten Dank an alle <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/2018067</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2018067</guid><dc:creator><![CDATA[Ollow_AM]]></dc:creator><pubDate>Tue, 08 Feb 2011 07:06:14 GMT</pubDate></item><item><title><![CDATA[Reply to Typename bei Template-Klasse on Tue, 08 Feb 2011 10:26:42 GMT]]></title><description><![CDATA[<p>Ollow_AM schrieb:</p>
<blockquote>
<p>@ hustbaer:<br />
Jap aber nur solange keiner versucht das Template mit einen 'eigeneKlasse*' zu füttern.</p>
</blockquote>
<p>Was wäre denn dann das Problem?</p>
<p>Ollow_AM schrieb:</p>
<blockquote>
<p>An obiger Stelle habe ich dann das Problem, wenn ich ein neues Object des Typen<br />
erstellen will. Denn im Klartext habe ich ja z.B. im Quellcode stehen</p>
<pre><code>int* t = new int*(*initObj);
</code></pre>
</blockquote>
<p>Hast du nicht. Wenn du foo&lt;int*&gt; instantiierst, greift die Spezialisierung foo&lt;T*&gt; und T ist int, nicht int*. Der code wird also zu</p>
<pre><code class="language-cpp">int t = new int(*initObj);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2018155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2018155</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 08 Feb 2011 10:26:42 GMT</pubDate></item><item><title><![CDATA[Reply to Typename bei Template-Klasse on Tue, 08 Feb 2011 14:06:23 GMT]]></title><description><![CDATA[<p>Okay, jetzt verstehe ich es.<br />
Das bedeutet wenn ich</p>
<pre><code class="language-cpp">myTemplateClass&lt;int&gt; a;
// bzw
myTemplateClass&lt;int*&gt; b;
</code></pre>
<p>aufrufe erkennt er das das eine ein 'Zeigertype' ist geht direkt auf die Speziealisierung. Wenn ich das richtig verstehe ist das &quot;ähnlich&quot; wie bei Funktionen mit verschiednen Signaturen die ja ebenfalls unterschieden werden.</p>
<p>Hmm, dann werd ich mir das nochmal durch den Kopf gehen lassen. Wie ich es machen werde.</p>
<p>Mit dem</p>
<pre><code class="language-cpp">template &lt;typename T&gt; 
struct rm_ptr
{
	typedef T type;
};
template &lt;typename T&gt;
struct rm_ptr&lt;T*&gt;
{
	typedef T type;
};
</code></pre>
<p>klappt nämlich alles einwandfrei. Aber werd das ganze mal überdenken, auf welche Art und Weise ich es lösen werde.<br />
Mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2018262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2018262</guid><dc:creator><![CDATA[Ollow_AM]]></dc:creator><pubDate>Tue, 08 Feb 2011 14:06:23 GMT</pubDate></item><item><title><![CDATA[Reply to Typename bei Template-Klasse on Tue, 08 Feb 2011 15:02:48 GMT]]></title><description><![CDATA[<p>Ollow_AM schrieb:</p>
<blockquote>
<p>Mit dem</p>
<pre><code class="language-cpp">template &lt;typename T&gt; 
struct rm_ptr
{
	typedef T type;
};
template &lt;typename T&gt;
struct rm_ptr&lt;T*&gt;
{
	typedef T type;
};
</code></pre>
<p>klappt nämlich alles einwandfrei.</p>
</blockquote>
<p>Weil es genau das selbe macht <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/2018288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2018288</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 08 Feb 2011 15:02:48 GMT</pubDate></item><item><title><![CDATA[Reply to Typename bei Template-Klasse on Tue, 08 Feb 2011 15:34:36 GMT]]></title><description><![CDATA[<p>Uhiala, jetzt wo du es sagst. Wird´s mir klar... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>&quot;Man sieht den Wald vor lauter Bäumen nicht..&quot; kann ich da nur sagen.. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2018307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2018307</guid><dc:creator><![CDATA[Ollow_AM]]></dc:creator><pubDate>Tue, 08 Feb 2011 15:34:36 GMT</pubDate></item></channel></rss>