<?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[downcast bei template-Klassen]]></title><description><![CDATA[<p>Hi</p>
<p>kann mir mal sagen warum folgender nicht funktioniert:</p>
<pre><code class="language-cpp">template &lt;typename S, typename T&gt;
class F {

  public:    

    F() {}

    inline virtual T operator() (const S&amp; x) {...}
    }; 

template &lt;typename S1, typename S2, typename T1, typename T2&gt; 
class FP : public F&lt;pair&lt;S1,S2&gt;,pair&lt;T1,T2&gt; &gt; {

  public:
    FP() : F&lt;pair&lt;S1,S2&gt;,pair&lt;T1,T2&gt; &gt; () {}

    pair&lt;T1,T2&gt; operator() (const pair&lt;S1,S2&gt;&amp; x) {...}

    pair&lt;T1,T2&gt; Test (const pair&lt;S1,S2&gt;&amp; x) {...}
    };

void Test() {
    F&lt;int,int&gt; g;
    F&lt;double,double&gt; f;    

    FP&lt;double,int,double,int&gt; fg;

    F&lt; pair&lt;double,int&gt; , pair&lt;double,int&gt; &gt; *p_fg_ptr = new F&lt; pair&lt;double,int&gt; , pair&lt;double,int&gt; &gt; (fg); 
    if (p_fg_ptr==0) cout &lt;&lt; &quot;ALARM!!&quot; &lt;&lt; endl;

    FP&lt;double,int,double,int&gt;* fg2 = dynamic_cast&lt;FP&lt;double,int,double,int&gt;* &gt; (p_fg_ptr) ;
    if (fg2==0) cout &lt;&lt; &quot;ALARM!! !!&quot; &lt;&lt; endl;
</code></pre>
<p>In Kurzfrom: F ist ein Template mit 2 Parametern, FP ist eine spezialisierung von F auf paarweise parameter ... erbt demzufolge von F.<br />
Der (implizite) upcast funktioniert, der explizite downcast nicht ... der loest ALARM aus ... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Warum geht das nicht? Mit einfachen (nicht-template) Klassen geht es glaube ich.</p>
<p>Viele Gruesse und vielen Dank</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/172800/downcast-bei-template-klassen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 01:51:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/172800.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 08 Feb 2007 14:47:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to downcast bei template-Klassen on Thu, 08 Feb 2007 14:47:38 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>kann mir mal sagen warum folgender nicht funktioniert:</p>
<pre><code class="language-cpp">template &lt;typename S, typename T&gt;
class F {

  public:    

    F() {}

    inline virtual T operator() (const S&amp; x) {...}
    }; 

template &lt;typename S1, typename S2, typename T1, typename T2&gt; 
class FP : public F&lt;pair&lt;S1,S2&gt;,pair&lt;T1,T2&gt; &gt; {

  public:
    FP() : F&lt;pair&lt;S1,S2&gt;,pair&lt;T1,T2&gt; &gt; () {}

    pair&lt;T1,T2&gt; operator() (const pair&lt;S1,S2&gt;&amp; x) {...}

    pair&lt;T1,T2&gt; Test (const pair&lt;S1,S2&gt;&amp; x) {...}
    };

void Test() {
    F&lt;int,int&gt; g;
    F&lt;double,double&gt; f;    

    FP&lt;double,int,double,int&gt; fg;

    F&lt; pair&lt;double,int&gt; , pair&lt;double,int&gt; &gt; *p_fg_ptr = new F&lt; pair&lt;double,int&gt; , pair&lt;double,int&gt; &gt; (fg); 
    if (p_fg_ptr==0) cout &lt;&lt; &quot;ALARM!!&quot; &lt;&lt; endl;

    FP&lt;double,int,double,int&gt;* fg2 = dynamic_cast&lt;FP&lt;double,int,double,int&gt;* &gt; (p_fg_ptr) ;
    if (fg2==0) cout &lt;&lt; &quot;ALARM!! !!&quot; &lt;&lt; endl;
</code></pre>
<p>In Kurzfrom: F ist ein Template mit 2 Parametern, FP ist eine spezialisierung von F auf paarweise parameter ... erbt demzufolge von F.<br />
Der (implizite) upcast funktioniert, der explizite downcast nicht ... der loest ALARM aus ... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Warum geht das nicht? Mit einfachen (nicht-template) Klassen geht es glaube ich.</p>
<p>Viele Gruesse und vielen Dank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225098</guid><dc:creator><![CDATA[Frager]]></dc:creator><pubDate>Thu, 08 Feb 2007 14:47:38 GMT</pubDate></item><item><title><![CDATA[Reply to downcast bei template-Klassen on Thu, 08 Feb 2007 15:12:24 GMT]]></title><description><![CDATA[<p>FP ist keine Spezialisierung von FP, sondern einfach eine Klasse (in diesem Fall zufällige ein Template) die F&lt;...&gt; als Basisklasse hat.<br />
In Deinem Code wird kein FP in ein F gecastet. Mit new instanzierst du ein F. Auch wenn die konkreten Parameter vom Typ std:pair&lt;...&gt; sind. Das heißt p_fg_ptr zeigt immer nur auf ein Objekt der Basisklasse F und das kann natürlich nicht in ein FP gecastet werden.</p>
<p>DJohn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225111</guid><dc:creator><![CDATA[DJohn]]></dc:creator><pubDate>Thu, 08 Feb 2007 15:12:24 GMT</pubDate></item></channel></rss>