<?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[Laufzeitpolymorphie über Templates?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich würde gerne Laufzeitpolymorphie über templates hinbekommen. mtx soll<br />
hier je nach if-else unterschiedlichen typ haben. allerdings weiß ich keine bessere lösung als Field von einer basiklasse erben zulassen um mtx auch im catch-block erreichbar zu machen. geht das nicht anders? ich würde mir gern die basisklasse sparen. Kommentiere ich das ein geht es natürlich.</p>
<p>danke euch</p>
<pre><code class="language-cpp">class Field_Base
{
    public:
};

template&lt;class T&gt;
class Field //: public Field_Base
{
    public:

};

int main(int argc, char** argv)
{
      //  Field_Base      *mtx = NULL;

        try {
            if (true) Field&lt;double&gt;* mtx = new Field&lt;double&gt;();
        } catch (std::runtime_error&amp; ex)
        {
            delete mtx;       
        }

        delete mtx;
        return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/267043/laufzeitpolymorphie-über-templates</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 14:26:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/267043.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 18 May 2010 11:46:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Laufzeitpolymorphie über Templates? on Tue, 18 May 2010 11:46:36 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich würde gerne Laufzeitpolymorphie über templates hinbekommen. mtx soll<br />
hier je nach if-else unterschiedlichen typ haben. allerdings weiß ich keine bessere lösung als Field von einer basiklasse erben zulassen um mtx auch im catch-block erreichbar zu machen. geht das nicht anders? ich würde mir gern die basisklasse sparen. Kommentiere ich das ein geht es natürlich.</p>
<p>danke euch</p>
<pre><code class="language-cpp">class Field_Base
{
    public:
};

template&lt;class T&gt;
class Field //: public Field_Base
{
    public:

};

int main(int argc, char** argv)
{
      //  Field_Base      *mtx = NULL;

        try {
            if (true) Field&lt;double&gt;* mtx = new Field&lt;double&gt;();
        } catch (std::runtime_error&amp; ex)
        {
            delete mtx;       
        }

        delete mtx;
        return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1898931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898931</guid><dc:creator><![CDATA[Hambo]]></dc:creator><pubDate>Tue, 18 May 2010 11:46:36 GMT</pubDate></item><item><title><![CDATA[Reply to Laufzeitpolymorphie über Templates? on Tue, 18 May 2010 11:53:28 GMT]]></title><description><![CDATA[<p>Hambo schrieb:</p>
<blockquote>
<p>ich würde gerne Laufzeitpolymorphie über templates hinbekommen.</p>
</blockquote>
<p>Das ist per Definition nicht möglich, da Templates vollständig zur Compilezeit ausgewertet werden. Du musst also tatsächlich Laufzeitpolymorphie (virtuelle Funktionen) verwenden.</p>
<p>Was allerdings der folgende Code bewirken soll, verstehe ich nicht. Vielleicht wird dein Anliegen mit sinnvollem, ausdrucksstarkem Code besser verständlich.</p>
<pre><code class="language-cpp">try {
            if (true) Field&lt;double&gt;* mtx = new Field&lt;double&gt;();
        } catch (std::runtime_error&amp; ex)
        {
            delete mtx;       
        }

        delete mtx;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1898934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898934</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 18 May 2010 11:53:28 GMT</pubDate></item><item><title><![CDATA[Reply to Laufzeitpolymorphie über Templates? on Tue, 18 May 2010 11:56:21 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>...Das ist per Definition nicht möglich, ...</p>
</blockquote>
<p>Sagen wir mal so: Templates behindern zwar Laufzeitpolymorphie nicht ... sie tragen aber zu dieser nichts bei.<br />
Genauso wie const.... <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>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898935</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898935</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 18 May 2010 11:56:21 GMT</pubDate></item><item><title><![CDATA[Reply to Laufzeitpolymorphie über Templates? on Tue, 18 May 2010 11:58:18 GMT]]></title><description><![CDATA[<p>Hmm danke aber das verstehe ich nicht.<br />
Ich kann doch durchaus eine if-else bedingung machen in der ich abfrage was ich haben will. evtl. ist die bezeichnung laufzeit-polymorphie hier verkehrt?<br />
ich meine sowas geht:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;stdexcept&gt;

class Field_Base
{
    public:
};

template&lt;class T&gt;
class Field //: public Field_Base
{
    public:

};

int main(int argc, char** argv)
{
      //  Field_Base      *mtx = NULL;

//         try {
//             if (true) Field&lt;double&gt;* mtx = new Field&lt;double&gt;();
//         } catch (std::runtime_error&amp; ex)
//         {
//             delete mtx;       
//         }
        if (true) Field&lt;double&gt;* mtx = new Field&lt;double&gt;();
        else Field&lt;int&gt;* mtx = new Field&lt;int&gt;();

        return 0;
}
</code></pre>
<p>mein obiger code solte so ausshen - das delete mtx; am ende ist weg.<br />
ich möchte einfach auf die variable auch im catch-block zugreifen. schaffe ich das ohne basisklasse nicht?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;stdexcept&gt;

class Field_Base
{
    public:
};

template&lt;class T&gt;
class Field //: public Field_Base
{
    public:

};

int main(int argc, char** argv)
{
      //  Field_Base      *mtx = NULL;

        try {
            if (true) Field&lt;double&gt;* mtx = new Field&lt;double&gt;();
        } catch (std::runtime_error&amp; ex)
        {
            delete mtx;       
        }

        return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1898936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898936</guid><dc:creator><![CDATA[Hambo]]></dc:creator><pubDate>Tue, 18 May 2010 11:58:18 GMT</pubDate></item><item><title><![CDATA[Reply to Laufzeitpolymorphie über Templates? on Tue, 18 May 2010 12:03:11 GMT]]></title><description><![CDATA[<p>1. Warum postest du nicht-kompilerbaren Code?<br />
2. Generell wirst du an einer Schnittstelle (Basisklasse) nicht vorbei kommen,<br />
wenn du etwas zur Laufzeit machen willst.<br />
3. Warum willst du es zur Laufzeit machen? Vielleicht ist ja ein Aufruf einer<br />
Template-Funktion in dem if bzw. else völlig ausreichend, falls du doppelten Code<br />
vermeiden willst</p>
<p>Ich glaub du solltest ein paar Informationen liefern, ansonsten kann dir nur einer<br />
von der Hellsehern mit der Kristallkugel helfen.</p>
<p>EDIT: Da sind ja neue Infos gekommen, während ich getippt habe<br />
EDIT 2: Dein Code ist trotzdem nicht kompilierfähig <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/1898937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898937</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 18 May 2010 12:03:11 GMT</pubDate></item><item><title><![CDATA[Reply to Laufzeitpolymorphie über Templates? on Tue, 18 May 2010 12:04:42 GMT]]></title><description><![CDATA[<p>Was willst du mit deinem field denn vor dem Löschen machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898938</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 18 May 2010 12:04:42 GMT</pubDate></item><item><title><![CDATA[Reply to Laufzeitpolymorphie über Templates? on Tue, 18 May 2010 12:08:03 GMT]]></title><description><![CDATA[<p>Hambo schrieb:</p>
<blockquote>
<p>mein obiger code solte so ausshen - das delete mtx; am ende ist weg.<br />
ich möchte einfach auf die variable auch im catch-block zugreifen. schaffe ich das ohne basisklasse nicht?</p>
</blockquote>
<p>Das tut alles nicht das was du erwartest:</p>
<p>1)an eine Variable mtx im catch-Block kommst du nur wenn diese Variable entweder <em>vor</em>dem try-Block, im catch-Block selber oder in der catch-Anweisug defniert hast.<br />
2) in den beiden if/else-blöcken definierst du jeweils eine neue Variable, die beide <em>auch</em> den Namen mtx haben - diese sind nur im jeweiligen Block der if/else-Anweisung gültig, so dass du, da du ihnen ein mit new erzeugtes Objekt zuweist, ein Speichereck hast. Die Variable mtx, die du vor dem try block definiert hast (und ohne die das alles eh nicht kompiliert), bleibt wie sie ist.</p>
<p>Die direkte Antwort auf deine Frage ist: du brauchst eine Basisklasse und du müsstest einen Pointer auf diese Basisklasse vor dem Try-Block definieren. UND du musst die Pointer auf die mit new erzeugten Objekte diesem Basispointer zu weisen und nicht irgendwelchen neuen lokalen Variablen mit gleichem Namen.</p>
<p>Aber eine wichtige Information hast du nicht geliefert - was du mit alldem <em>erreichen</em> willst. Das sieht irgendwie aus als versuchst du ein Problem evtl. mit den falschen Mitteln zu lösen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898941</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 18 May 2010 12:08:03 GMT</pubDate></item><item><title><![CDATA[Reply to Laufzeitpolymorphie über Templates? on Tue, 18 May 2010 12:08:14 GMT]]></title><description><![CDATA[<blockquote>
<p>EDIT 2: Dein Code ist trotzdem nicht kompilierfähig <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>
</blockquote>
<p>bei mir ist er das (linux+ g++ v 4.1.2)</p>
<blockquote>
<p>Was willst du mit deinem field denn vor dem Löschen machen?</p>
</blockquote>
<p>Methoden von field aufrufen und auch field an andere Klassenmethoden übergeben z.B.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898942</guid><dc:creator><![CDATA[Hambo]]></dc:creator><pubDate>Tue, 18 May 2010 12:08:14 GMT</pubDate></item><item><title><![CDATA[Reply to Laufzeitpolymorphie über Templates? on Tue, 18 May 2010 12:08:40 GMT]]></title><description><![CDATA[<p>Hambo schrieb:</p>
<blockquote>
<p>Hmm danke aber das verstehe ich nicht.<br />
Ich kann doch durchaus eine if-else bedingung machen in der ich abfrage was ich haben will. evtl. ist die bezeichnung laufzeit-polymorphie hier verkehrt?<br />
ich meine sowas geht:</p>
<pre><code class="language-cpp">if (true) Field&lt;double&gt;* mtx = new Field&lt;double&gt;();
        else Field&lt;int&gt;* mtx = new Field&lt;int&gt;();
</code></pre>
</blockquote>
<p>Nein, sowas geht nicht. Zumindest nicht über den Scope der If-Else-Abfrage hinaus und damit ist keine Polymorphie möglich.</p>
<p>Hambo schrieb:</p>
<blockquote>
<pre><code class="language-cpp">try {
            if (true) Field&lt;double&gt;* mtx = new Field&lt;double&gt;();
        } catch (std::runtime_error&amp; ex)
        {
            delete mtx;       
        }
</code></pre>
</blockquote>
<p>Wie gesagt, was bringt das? Wenn <code>new</code> fehlschlägt und <code>std::bad_alloc</code> wirft (die nicht von <code>std::runtime_error</code> abgeleitet ist), wird der Speicher automatisch freigegeben. Und das <code>if(true)</code> bringt ja wohl gar nichts.</p>
<p>Wenn du Laufzeitpolymorphie willst, kommst du nicht an virtuellen Funktionen vorbei. Bzw. die Alternativen sind meistens noch viel mehr Gefrickel (manuelle Fallunterscheidungen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898943</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 18 May 2010 12:08:40 GMT</pubDate></item><item><title><![CDATA[Reply to Laufzeitpolymorphie über Templates? on Tue, 18 May 2010 12:11:29 GMT]]></title><description><![CDATA[<blockquote>
<p>Aber eine wichtige Information hast du nicht geliefert - was du mit alldem erreichen willst. Das sieht irgendwie aus als versuchst du ein Problem evtl. mit den falschen Mitteln zu lösen.</p>
</blockquote>
<p>Ich lese eine datei ein in der entweder eine reelle oder komplexe matrix liegt. diese möchte ich templateabhängig einlesen und datenstrukturen darauf generieren. das passiert z.B. in der Field-Klasse - der Name Matrix-klasse wäre hier wohl sinnvoller. Das kann ich aber erst zur laufzeit entscheiden.<br />
anschließend übergebe ich dieses objekt an den algorithmus (anderes objekt z.B.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898944</guid><dc:creator><![CDATA[Hambo]]></dc:creator><pubDate>Tue, 18 May 2010 12:11:29 GMT</pubDate></item><item><title><![CDATA[Reply to Laufzeitpolymorphie über Templates? on Tue, 18 May 2010 12:14:08 GMT]]></title><description><![CDATA[<blockquote>
<p>Wenn new fehlschlägt und std::bad_alloc wirft (die nicht von std::runtime_error abgeleitet ist), wird der Speicher automatisch freigegeben.</p>
</blockquote>
<p>passiert das auch im falle std::runtime_error ?</p>
<p>Es ist doch unsauber bei einem catch einfach nur ein return reinzuklatschen und<br />
keinen heap freizugeben oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898948</guid><dc:creator><![CDATA[Hambo]]></dc:creator><pubDate>Tue, 18 May 2010 12:14:08 GMT</pubDate></item><item><title><![CDATA[Reply to Laufzeitpolymorphie über Templates? on Tue, 18 May 2010 12:17:47 GMT]]></title><description><![CDATA[<p>Der Algo müsste entweder auch ein Template sein, oder (was ich eher vermute) arbeitet auf einer allgemeinen Matrixklasse, von der das Matrix-Klassentemplate dann das Interface erbt. In dem Fall hast du deine Basisklasse dann schon.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898952</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 18 May 2010 12:17:47 GMT</pubDate></item><item><title><![CDATA[Reply to Laufzeitpolymorphie über Templates? on Tue, 18 May 2010 12:19:21 GMT]]></title><description><![CDATA[<p>Hambo schrieb:</p>
<blockquote>
<p>Ich lese eine datei ein in der entweder eine reelle oder komplexe matrix liegt. diese möchte ich templateabhängig einlesen und datenstrukturen darauf generieren.</p>
</blockquote>
<p>Schreib dir eine Basisklasse für die Matrix (möglicherweise reines Interface mit pur-virtuellen Funktionen) und leite davon das Template ab.</p>
<p>Hambo schrieb:</p>
<blockquote>
<p>passiert das auch im falle std::runtime_error ?</p>
</blockquote>
<p>Du meinst, falls der Konstruktor der Klasse einen <code>std::runtime_error</code> wirft? Ja, der entsprechende <code>operator delete</code> wird aufgerufen, um den Speicherplatz freizugeben. Das muss ja der Fall sein, da man den Speicher sonst unweigerlich verlieren würde (denk dran, ein fehlgeschlagenes <code>new</code> kann keine gültige Adresse zurückgeben).</p>
<p>Hambo schrieb:</p>
<blockquote>
<p>Es ist doch unsauber bei einem catch einfach nur ein return reinzuklatschen und<br />
keinen heap freizugeben oder?</p>
</blockquote>
<p>Wieso freigeben, was schon freigegeben wurde? Das führt zu undefiniertem Verhalten. <em>Das</em> wäre unsauber.</p>
<p>Ein <code>try-catch</code> brauchst du, wenn du zusätzlichen manuellen Speicher angefordert hast oder auf eine andere Weise auf Fehler reagieren willst. Aber sicher nicht per se.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898954</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 18 May 2010 12:19:21 GMT</pubDate></item><item><title><![CDATA[Reply to Laufzeitpolymorphie über Templates? on Tue, 18 May 2010 12:26:05 GMT]]></title><description><![CDATA[<p>Wenn du deine Daten an eine andere Funktion lieferst,<br />
hast du sicherlich eine Schnittstellen-Definition.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;typename T&gt;
class Field
{
public:
        typedef T type;
        T value;
};

template&lt;typename T&gt; void doSomething(T&amp; t){
        typename T::type value = t.value;
        t.value = value / 3;
}

int main(int argc, char** argv)
{
       int i=0;
       if (i==0){
                Field&lt;double&gt; mtx;
                doSomething(mtx);
       } else {
                Field&lt;int&gt; mtx;
                doSomething(mtx);
       }

        return 0;
}
</code></pre>
<p>Also hier ist dein Field auf dem Stack -&gt; keine Gefahr wegen Exception<br />
Wenn du jetzt noch nen return type für doSomething einführst, der ja<br />
(hoffentlich) eine Schnittstellendefinition hat, dann kannst alles in<br />
Template-Funktionen behandeln und das Schnittstellen-fähige Object zurückliefern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1898959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1898959</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 18 May 2010 12:26:05 GMT</pubDate></item><item><title><![CDATA[Reply to Laufzeitpolymorphie über Templates? on Tue, 18 May 2010 13:36:07 GMT]]></title><description><![CDATA[<p>Gibst ein Grund warum dies nicht vorgeschlagen wird?:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt; 

template&lt;typename T&gt; 
struct Field 
{ 
	T value; 
}; 

template&lt;class T&gt; void doSomething(Field&lt;T&gt;&amp; t) { 
        // t.value = value / 3; 
	    // Don't Call it!
} 

template&lt;&gt; void doSomething&lt;int&gt;(Field&lt;int&gt;&amp; t) {
	t.value = t.value / 3; 
}

template&lt;&gt; void doSomething&lt;double&gt;(Field&lt;double&gt;&amp; t) {
	t.value = t.value / 3.0; 
}

int main(int argc, char** argv) 
{ 

        Field&lt;double&gt; a; 
        doSomething(a); 

        Field&lt;int&gt; b; 
        doSomething(b); 

        return 0; 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1899002</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1899002</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Tue, 18 May 2010 13:36:07 GMT</pubDate></item><item><title><![CDATA[Reply to Laufzeitpolymorphie über Templates? on Tue, 18 May 2010 14:32:44 GMT]]></title><description><![CDATA[<p>Ja danke für die Hilfe.<br />
Ich möchte abe die Objekte auf dem Heap halten. Mir ist jetzt folgendes nicht klar bzw. ich weiß nicht wie ich das folgende Problem lösen könnte. Was mache ich denn wenn ich eine template-basierte klasse habe (die von einer basisklasse erbt) und die eine templatebasierte funktion hat !? Ich muss ja jede Methode in der Basisklasse deklarieren - dort habe ich aber keinen Template-parameter !? Wie mache ich denn das oder geht das nicht?</p>
<p>!!! Achtung! Das folgende Bsp. kompiliert nicht!</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class Mtx_Base
{
    public:
        virtual ~Mtx_Base();
        virtual void foo() = 0;
};
template&lt;class T&gt;
class Mtx : public Mtx_Base
{
    public:
        void foo() {};

};

class Reader_Base
{
    public:
        virtual ~Reader_Base();
        // !!!!!!!! Geht nicht !?
        virtual void read(Mtx&lt;T&gt;*&amp; mtx) = 0;
};
template&lt;class T&gt;
class Reader : public Reader_Base
{
    public:
        void read(Mtx&lt;T&gt;*&amp; mtx) {}

};

int main(int argc, char** argv)
{
    Mtx_Base      *mtx = NULL;
    Reader_Base* reader = NULL;

    if (true) 
    {
        Mtx&lt;double&gt;* mtx = new Mtx&lt;double&gt;();
        reader = new Reader&lt;double&gt;();
    }
    reader-&gt;read(mtx);
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1899049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1899049</guid><dc:creator><![CDATA[Hambo]]></dc:creator><pubDate>Tue, 18 May 2010 14:32:44 GMT</pubDate></item><item><title><![CDATA[Reply to Laufzeitpolymorphie über Templates? on Tue, 18 May 2010 15:02:03 GMT]]></title><description><![CDATA[<p>Hambo schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// !!!!!!!! Geht nicht !?
        virtual void read(Mtx&lt;T&gt;*&amp; mtx) = 0;
</code></pre>
</blockquote>
<p>Warum eine Referenz auf einen Zeiger auf eine <code>Mtx&lt;T&gt;</code> -Instanz als Parameter? Spricht etwas gegen <code>Mtx_Base&amp;</code> ?</p>
<p>Übrigens solltest du, wenn du schon unbedingt selbst Speicher verwalten willst, diesen wieder mit <code>delete</code> freigeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1899088</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1899088</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 18 May 2010 15:02:03 GMT</pubDate></item><item><title><![CDATA[Reply to Laufzeitpolymorphie über Templates? on Tue, 18 May 2010 15:30:07 GMT]]></title><description><![CDATA[<p>Zeus schrieb:</p>
<blockquote>
<p>Gibst ein Grund warum dies nicht vorgeschlagen wird?:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt; 

template&lt;typename T&gt; 
struct Field 
{ 
	T value; 
}; 

template&lt;class T&gt; void doSomething(Field&lt;T&gt;&amp; t) { 
        // t.value = value / 3; 
	    // Don't Call it!
} 

template&lt;&gt; void doSomething&lt;int&gt;(Field&lt;int&gt;&amp; t) {
	t.value = t.value / 3; 
}

template&lt;&gt; void doSomething&lt;double&gt;(Field&lt;double&gt;&amp; t) {
	t.value = t.value / 3.0; 
}

int main(int argc, char** argv) 
{ 

        Field&lt;double&gt; a; 
        doSomething(a); 

        Field&lt;int&gt; b; 
        doSomething(b); 

        return 0; 
}
</code></pre>
</blockquote>
<p>Hi Zeus,</p>
<p>ich wollte nur zeigen, dass er nicht alles doppelt implementieren muss, wenn<br />
er Templates verwendet.</p>
<p>Ich hatte auch erst überlegt, ob ich in meiner Templatefunktion noch eine andere<br />
Funktion aufrufe, die bei double und int unterschiedliche Funktionen aufruft, da<br />
dieser Funktionsname für doube und int existiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1899107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1899107</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 18 May 2010 15:30:07 GMT</pubDate></item><item><title><![CDATA[Reply to Laufzeitpolymorphie über Templates? on Wed, 19 May 2010 18:05:51 GMT]]></title><description><![CDATA[<blockquote>
<p>arum eine Referenz auf einen Zeiger auf eine Mtx&lt;T&gt;-Instanz als Parameter? Spricht etwas gegen Mtx_Base&amp;?</p>
</blockquote>
<p>ich steh immer noch aufm schlauch.<br />
kann ich denn das Mtx-Objekt dann verändern? Also über *&amp; ? Geht das wenn ich einen pointer setze oder muss ich es wirklcih nur per referenz machen. Aber auch so krieg ichs leider net hin:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class Mtx_Base
{
    public:
        virtual ~Mtx_Base();
        virtual void foo() = 0;
};
template&lt;class T&gt;
class Mtx : public Mtx_Base
{
    public:
        void foo() {};

};

class Reader_Base
{
    public:
        virtual ~Reader_Base();
        // !!!!!!!! Geht nicht !?
        virtual void read(Mtx_Base&amp; mtx) = 0;
};
template&lt;class T&gt;
class Reader : public Reader_Base
{
    public:
        void read(Mtx_Base&amp; mtx) {}

};

int main(int argc, char** argv)
{
    Mtx_Base      *mtx = NULL;

    Reader_Base* reader = NULL;

    if (true) 
    {
        mtx = new Mtx&lt;double&gt;();
        reader = new Reader&lt;double&gt;();
    }
    reader-&gt;read(mtx);

    delete mtx;
    delete reader;
    return 0;
}
</code></pre>
<p>Meldung ist:</p>
<pre><code>test2.cpp: In function »int main(int, char**)«:
test2.cpp:43: Fehler: keine passende Funktion für Aufruf von »Reader_Base::read(Mtx_Base*&amp;)«
test2.cpp:22: Anmerkung: Kandidaten sind: virtual void Reader_Base::read(Mtx_Base&amp;)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1899731</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1899731</guid><dc:creator><![CDATA[Hambo]]></dc:creator><pubDate>Wed, 19 May 2010 18:05:51 GMT</pubDate></item><item><title><![CDATA[Reply to Laufzeitpolymorphie über Templates? on Wed, 19 May 2010 19:25:22 GMT]]></title><description><![CDATA[<p>Hambo schrieb:</p>
<blockquote>
<p>kann ich denn das Mtx-Objekt dann verändern? Also über *&amp;</p>
</blockquote>
<p>Vergiss erst mal Referenzen auf Zeiger, die brauchst du hier nicht.</p>
<p>Beim Aufruf von <code>read()</code> musst du nicht den Zeiger übergeben, sondern eine Referenz auf das <strong>Objekt</strong> (und nicht auf den Zeiger!), auf welches der Zeiger zeigt. Also musst du <code>mtx</code> zuerst dereferenzieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1899788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1899788</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 19 May 2010 19:25:22 GMT</pubDate></item><item><title><![CDATA[Reply to Laufzeitpolymorphie über Templates? on Wed, 19 May 2010 19:47:20 GMT]]></title><description><![CDATA[<p><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="😞"
    /> sorry...ich bin zu blöd. auch so gehts nicht (siehe unten).<br />
kannst du mir den code vielleicht zeigen den du meisnt. ich bekomme ständig undefined references oder eben errors.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class Mtx_Base
{
    public:
        virtual ~Mtx_Base();
        virtual void foo() = 0;
};
template&lt;class T&gt;
class Mtx : public Mtx_Base
{
    public:
        void foo() {};

};

class Reader_Base
{
    public:
        virtual ~Reader_Base();
        // !!!!!!!! Geht nicht !?
        virtual void read(Mtx_Bas&amp; mtx) = 0;
};
template&lt;class T&gt;
class Reader : public Reader_Base
{
    public:
        void read(Mtx_Base&amp; mtx) {}

};

int main(int argc, char** argv)
{
    Mtx_Base      *mtx = NULL;

    Reader_Base* reader = NULL;

    if (true) 
    {
        mtx = new Mtx&lt;double&gt;();
        reader = new Reader&lt;double&gt;();
    }
    reader-&gt;read(*mtx);

    delete mtx;
    delete reader;
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1899808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1899808</guid><dc:creator><![CDATA[Hambo]]></dc:creator><pubDate>Wed, 19 May 2010 19:47:20 GMT</pubDate></item><item><title><![CDATA[Reply to Laufzeitpolymorphie über Templates? on Wed, 19 May 2010 19:53:14 GMT]]></title><description><![CDATA[<p>Hast du die Fehler überhaupt angeschaut? Achte nur auf die Zeilennummer, du hast einen Tippfehler.</p>
<p>Und natürlich musst du die verwendeten Funktionen auch definieren. Da der rein virtuelle Destruktor von der abgeleiteten Klasse aufgerufen werden muss, sollte er trotzdem eine (leere) Definition erhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1899812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1899812</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 19 May 2010 19:53:14 GMT</pubDate></item><item><title><![CDATA[Reply to Laufzeitpolymorphie über Templates? on Wed, 19 May 2010 20:09:19 GMT]]></title><description><![CDATA[<p>Danke. Jetzt versteh ichs auch. so klappte es danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1899830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1899830</guid><dc:creator><![CDATA[Hambo]]></dc:creator><pubDate>Wed, 19 May 2010 20:09:19 GMT</pubDate></item><item><title><![CDATA[Reply to Laufzeitpolymorphie über Templates? on Wed, 19 May 2010 20:10:19 GMT]]></title><description><![CDATA[<p>Eh moment noch <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>kann ich jetzt noch mit dem pointer rangehen? als Matrix_Base*&amp; mtx in die signatur übergeben oder verstehe ich hier noch etwas nicht ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1899831</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1899831</guid><dc:creator><![CDATA[Hambo]]></dc:creator><pubDate>Wed, 19 May 2010 20:10:19 GMT</pubDate></item><item><title><![CDATA[Reply to Laufzeitpolymorphie über Templates? on Wed, 19 May 2010 20:12:30 GMT]]></title><description><![CDATA[<p>Ah klappt auch <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="🙂"
    /> Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1899835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1899835</guid><dc:creator><![CDATA[Hambo]]></dc:creator><pubDate>Wed, 19 May 2010 20:12:30 GMT</pubDate></item><item><title><![CDATA[Reply to Laufzeitpolymorphie über Templates? on Fri, 21 May 2010 10:06:13 GMT]]></title><description><![CDATA[<p>Ich hätte zu unserem Beispiel noch eine frage.<br />
Ich habe jetzt in Mtx einen Member Lines der templatebasiert ist.<br />
So kann ich den natürlich dann in Reader nicht verwenden weil in read()<br />
nur ein Mtx_Base zur Verfügung steht. Ich könnte Lines in Mtx_Base als member verfrachten aber dann kann ich keinen template-typen angeben für Lines dort. Muss ich dann wieder eine Basisklasse Lines_Base erstellen und diese dann in Mtx_Base definieren. Das ganze wird ja immer umständlicher....</p>
<p>Kann mir jemand helfen? Danke</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
template&lt;class T&gt;
class Lines
{
    public:
        Lines&lt;T&gt; () {}
        ~Lines&lt;T&gt;() {}      
};

class Mtx_Base
{
    public:
        virtual ~Mtx_Base() {}
        virtual void foo() = 0;
};
template&lt;class T&gt;
class Mtx : public Mtx_Base
{
    public:
        Mtx() { lines = NULL;}
        void foo() {};
        Lines&lt;T&gt; * lines;

};

class Reader_Base
{
    public:
        virtual ~Reader_Base() {}
        // !!!!!!!! Geht nicht !?
        virtual void read(Mtx_Base*&amp; mtx) = 0;
};
template&lt;class T&gt;
class Reader : public Reader_Base
{
    public:
        void read(Mtx_Base*&amp; mtx) {
            mtx-&gt;lines = new Lines&lt;T&gt;();
        }

};

int main(int argc, char** argv)
{
    Mtx_Base      *mtx = NULL;

    Reader_Base* reader = NULL;

    if (true) 
    {
        mtx = new Mtx&lt;double&gt;();
        reader = new Reader&lt;double&gt;();
    }
    reader-&gt;read(mtx);

    delete mtx;
    delete reader;
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1900642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1900642</guid><dc:creator><![CDATA[Hambo]]></dc:creator><pubDate>Fri, 21 May 2010 10:06:13 GMT</pubDate></item></channel></rss>