<?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[template Zeiger; Compiler will reinterpret_cast]]></title><description><![CDATA[<p>Hi, folgender Code:</p>
<pre><code class="language-cpp">template&lt;typename typeA&gt; class A {

    template&lt;typename typeB&gt; class B;

    B&lt;typename&gt; *_B;

    void test() {
        _B = B&lt;float&gt;::getInstance();
    }
};
</code></pre>
<p>Ein Aufruf durch z.B. ein A&lt;unsigned&gt; Objekt ergibt:</p>
<pre><code>1&gt;(8) : error C2440: '=' : cannot convert from 'A&lt;typeA&gt;::B&lt;typeB&gt; *' to 'A&lt;typeA&gt;::B&lt;typeB&gt; *'
1&gt;        with
1&gt;        [
1&gt;            typeA=unsigned int,
1&gt;            typeB=float
1&gt;        ]
1&gt;        and
1&gt;        [
1&gt;            typeA=unsigned int,
1&gt;            typeB=int
1&gt;        ]
1&gt;        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
</code></pre>
<p>Kann mir nur vorstellen dass meine Syntax in Zeile 5 daneben liegt aber find auch keine andere Lösung.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/204997/template-zeiger-compiler-will-reinterpret_cast</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 20:25:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/204997.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 09 Feb 2008 09:34:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to template Zeiger; Compiler will reinterpret_cast on Sat, 09 Feb 2008 09:34:39 GMT]]></title><description><![CDATA[<p>Hi, folgender Code:</p>
<pre><code class="language-cpp">template&lt;typename typeA&gt; class A {

    template&lt;typename typeB&gt; class B;

    B&lt;typename&gt; *_B;

    void test() {
        _B = B&lt;float&gt;::getInstance();
    }
};
</code></pre>
<p>Ein Aufruf durch z.B. ein A&lt;unsigned&gt; Objekt ergibt:</p>
<pre><code>1&gt;(8) : error C2440: '=' : cannot convert from 'A&lt;typeA&gt;::B&lt;typeB&gt; *' to 'A&lt;typeA&gt;::B&lt;typeB&gt; *'
1&gt;        with
1&gt;        [
1&gt;            typeA=unsigned int,
1&gt;            typeB=float
1&gt;        ]
1&gt;        and
1&gt;        [
1&gt;            typeA=unsigned int,
1&gt;            typeB=int
1&gt;        ]
1&gt;        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
</code></pre>
<p>Kann mir nur vorstellen dass meine Syntax in Zeile 5 daneben liegt aber find auch keine andere Lösung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1452417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1452417</guid><dc:creator><![CDATA[NatOp]]></dc:creator><pubDate>Sat, 09 Feb 2008 09:34:39 GMT</pubDate></item><item><title><![CDATA[Reply to template Zeiger; Compiler will reinterpret_cast on Sat, 09 Feb 2008 10:17:28 GMT]]></title><description><![CDATA[<p>NatOp schrieb:</p>
<blockquote>
<p>Kann mir nur vorstellen dass meine Syntax in Zeile 5 daneben liegt aber find auch keine andere Lösung.</p>
</blockquote>
<p>Da du in Zeile 5 eine Variable deklarierst, musst du da imho auch den Template-Parameter angeben. Willst du evtl <code>B&lt;typeA&gt; *_B;</code> ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1452435</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1452435</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sat, 09 Feb 2008 10:17:28 GMT</pubDate></item><item><title><![CDATA[Reply to template Zeiger; Compiler will reinterpret_cast on Sat, 09 Feb 2008 11:24:54 GMT]]></title><description><![CDATA[<p>eben nicht; der typ von B wird erst beim Konstruktoraufruf von A klar</p>
<p>edit: also eher</p>
<pre><code class="language-cpp">template&lt;typename typeA&gt; class A { 

    template&lt;typename typeB&gt; class B; 

    B&lt;typename&gt; *_B; 

    A&lt;typeA&gt;() { 
        _B = B&lt;float&gt;::getInstance(); 
    } 

    /**
     * wie &quot;setze&quot; ich nun typeB richtig, 
     * damit es auch spaeter geaendert werden kann?
     */

    void setB(string bla) {
        if (!bla.compare(&quot;blub&quot;)) {
            _B = B&lt;double&gt;::getInstance();
        }
    }

};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1452452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1452452</guid><dc:creator><![CDATA[NatOp]]></dc:creator><pubDate>Sat, 09 Feb 2008 11:24:54 GMT</pubDate></item><item><title><![CDATA[Reply to template Zeiger; Compiler will reinterpret_cast on Sat, 09 Feb 2008 11:40:45 GMT]]></title><description><![CDATA[<p>NatOp schrieb:</p>
<blockquote>
<p>eben nicht; der typ von B wird erst beim Konstruktoraufruf von A klar</p>
</blockquote>
<p>Bist du dir da sicher? Mir wäre das jedenfalls neu, C++ ist ja statisch typisiert und bei zwei verschiedenen Konstruktoraufrufen mit unterschiedlicher Initialisierung (obwohl du in deinem Konstruktor ja eh nur eine Zuweisung hast) wäre der Typ nicht besonders &quot;klar&quot;.</p>
<p>Mir scheint, als würde der Compiler bei <code>B&lt;typename&gt; *_B;</code> automatisch <code>int</code> als Template-Parameter nehmen. Wenn der Typ vorher nicht klar ist, verwende (Laufzeit-)Polymorphie; so wie du das hier vorhast, funktioniert es imho nicht.</p>
<p>edit: Bin mir sicher, dass es so nicht funktioniert. Du kannst zur Laufzeit einfach nicht den Typ von _B verändern, ebenso wenig wird er erst bei der Initialisierung klar.<br />
edit2: Was willst du mit dem Code denn erreichen? Gibt sicherlich einen anderen Weg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1452458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1452458</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sat, 09 Feb 2008 11:40:45 GMT</pubDate></item><item><title><![CDATA[Reply to template Zeiger; Compiler will reinterpret_cast on Sat, 09 Feb 2008 12:01:40 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>edit2: Was willst du mit dem Code denn erreichen? Gibt sicherlich einen anderen Weg.</p>
</blockquote>
<p>Klasse A speichert über ein Array vom Typ typeA irgendwas ab, z.B. vom Typ unsigned int.<br />
Man soll nun von Klasse A beliebig oft einen Pointer auf eine Instanz der Klasse B kriegen können;<br />
stimmt der aktuelle Typ der Singleton-Instanz in B nicht mit der von getInstance überein, wird eine neue Instanz mit neuem Typ erstellt und die alten Werte übernommen.<br />
Das ganze hat den Sinn, dass man für A zum Speichern von Daten &quot;kleine&quot; Typen nehmen kann,<br />
um auf ihnen dann komplexe Operationen auszuführen, können in B auf temporären double oder long Arrays gerechnet werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1452463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1452463</guid><dc:creator><![CDATA[NatOp]]></dc:creator><pubDate>Sat, 09 Feb 2008 12:01:40 GMT</pubDate></item><item><title><![CDATA[Reply to template Zeiger; Compiler will reinterpret_cast on Sat, 09 Feb 2008 12:34:52 GMT]]></title><description><![CDATA[<p>Wäre dann nicht vielleicht sowas sinnvoller?:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; class LittleArrayHolder
{
    public:
		template&lt;typename U&gt; void DoTransformations()
		{
			std::vector&lt;U&gt; big_vals( m_aValues.begin(), m_aValues.end() );
			// Irgendwas damit machen
			m_aValues.swap( std::vector&lt;T&gt;( big_vals.begin(), big_vals.end() ) );
		}

		// Oder, ohne Warnungen:
		template&lt;typename U&gt; void DoTransformations2()
		{
			std::vector&lt;U&gt; big_vals;
			big_vals.reserve( m_aValues.size() );
			for ( std::vector&lt;T&gt;::const_iterator valIter=m_aValues.begin(); valIter!=m_aValues.end(); valIter++ )
				big_vals.push_back( static_cast&lt;U&gt;(*valIter) );

			// Irgendwas damit machen

			for ( std::vector&lt;U&gt;::size_type i=0; i&lt;big_vals.size(); i++ )
				m_aValues[i] = static_cast&lt;T&gt;( big_vals[i] );
		}

	private:
		std::vector&lt;T&gt; m_aValues;
};
</code></pre>
<p>Bleibt dem Anwender natürlich die Verantwortung überlassen, dass er auch die richtigen Typen übergibt. Wäre das in etwa das, was du vorhattest?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1452478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1452478</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sat, 09 Feb 2008 12:34:52 GMT</pubDate></item><item><title><![CDATA[Reply to template Zeiger; Compiler will reinterpret_cast on Sat, 09 Feb 2008 13:06:46 GMT]]></title><description><![CDATA[<p>hm ok vielen dank, nettes konstrukt.<br />
werd na gucken wie ich klarkomm</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1452491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1452491</guid><dc:creator><![CDATA[NatOp]]></dc:creator><pubDate>Sat, 09 Feb 2008 13:06:46 GMT</pubDate></item></channel></rss>