<?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[Templates: reinterpret_cast auf initialisierte Template-Basis-Klasse schlägt fehl]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich verwende Visual Studio 2010 und Qt unter Windows.<br />
Da ich für den Container QList ein paar weitere Funktionen brauche, habe ich mir eine Container-Template-Klasse von QList und QListIterator abgeleitet.</p>
<p>Aufbauend auf diesen Template-Klassen habe ich für eine Klasse DNode einen Iterator definiert, der sich von meinen definierten Template-Klassen ableitet. Ich habe mal ein Minimalbeispiel aufbereitet:</p>
<pre><code>#include &lt;QList&gt;
#include &lt;QListIterator&gt;
//-------------------------------------------------------
//Template-Deklarationen

//Ableitung von QList

template &lt;class T&gt; class dList : public QList&lt;T*&gt; {
public:
   dList(T* t) { append(t); }
   dList(const dList&lt;T*&gt; *olist = NULL) {append(olist); }
};

//Ableitung von QListIterator
template &lt;class T&gt; class dListIt : public QListIterator&lt;T*&gt; {
public:
   dListIt(dList&lt;T*&gt; *t) : QListIterator&lt;T*&gt; (*t) { toFront(); }
};

//Node-Klasse
class DNode{
public:
    int nodeNo;
};

//Ableitung von dList mit Typ DNode
class ArrDlist:public dList&lt;DNode*&gt;{
    public:
    ArrDlist();
private:
    int sortCol;
    Qt::SortOrder sortOrder;
};

//Iterator für die Klasse DNode
class ArrDlistIt:public dListIt&lt;DNode*&gt; {
public:
   ArrDlistIt(ArrDlist * p):dListIt&lt;DNode*&gt;( reinterpret_cast&lt;dList&lt;DNode*&gt;*&gt; (p) ) {} //C2664-Fehler
};

//----------------------------
//--main--
int main(int argc, char *argv[])
{
    ArrDlist* array = new ArrDlist();
    ArrDlistIt iter(array);
}
</code></pre>
<p>Allerdings bekomme ich eine Fehlermeldung, wenn ich im Konstruktor des Iterators versuche, den Basisklassenkonstruktor aufzurufen, obwohl ich den Typ der Template-Klasse spezifiziere und meineserachtens das auch richtig caste:</p>
<blockquote>
<p>dlist.hpp:41: Fehler:C2664: 'dListIt&lt;T&gt;::dListIt(dList&lt;T *&gt; *)': Konvertierung des Parameters 1 von 'dList&lt;T&gt; *' in 'dList&lt;T&gt; *' nicht m”glich<br />
with<br />
[<br />
T=DNode *<br />
]<br />
Die Typen, auf die verwiesen wird, sind nicht verknpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.</p>
</blockquote>
<p>Ich verstehe den Fehler nicht wirklich, da ich den Typ der abgeleiteten Templateklasse bei der Vererbung definiert, also damit initialisiert habe.</p>
<p>Oder ist generell bei Template-Klassen der Aufruf der Basisklassen-Methoden nicht möglich, so dass ich die Methoden immer in der erbenden Klasse überschreiben muss?</p>
<p>Vielen Dank schon mal für eure Hilfe.</p>
<p>Viele Grüße,</p>
<p>Tobias</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/317019/templates-reinterpret_cast-auf-initialisierte-template-basis-klasse-schlägt-fehl</link><generator>RSS for Node</generator><lastBuildDate>Wed, 29 Jul 2026 11:25:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/317019.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 24 May 2013 15:10:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Templates: reinterpret_cast auf initialisierte Template-Basis-Klasse schlägt fehl on Fri, 24 May 2013 15:11:44 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich verwende Visual Studio 2010 und Qt unter Windows.<br />
Da ich für den Container QList ein paar weitere Funktionen brauche, habe ich mir eine Container-Template-Klasse von QList und QListIterator abgeleitet.</p>
<p>Aufbauend auf diesen Template-Klassen habe ich für eine Klasse DNode einen Iterator definiert, der sich von meinen definierten Template-Klassen ableitet. Ich habe mal ein Minimalbeispiel aufbereitet:</p>
<pre><code>#include &lt;QList&gt;
#include &lt;QListIterator&gt;
//-------------------------------------------------------
//Template-Deklarationen

//Ableitung von QList

template &lt;class T&gt; class dList : public QList&lt;T*&gt; {
public:
   dList(T* t) { append(t); }
   dList(const dList&lt;T*&gt; *olist = NULL) {append(olist); }
};

//Ableitung von QListIterator
template &lt;class T&gt; class dListIt : public QListIterator&lt;T*&gt; {
public:
   dListIt(dList&lt;T*&gt; *t) : QListIterator&lt;T*&gt; (*t) { toFront(); }
};

//Node-Klasse
class DNode{
public:
    int nodeNo;
};

//Ableitung von dList mit Typ DNode
class ArrDlist:public dList&lt;DNode*&gt;{
    public:
    ArrDlist();
private:
    int sortCol;
    Qt::SortOrder sortOrder;
};

//Iterator für die Klasse DNode
class ArrDlistIt:public dListIt&lt;DNode*&gt; {
public:
   ArrDlistIt(ArrDlist * p):dListIt&lt;DNode*&gt;( reinterpret_cast&lt;dList&lt;DNode*&gt;*&gt; (p) ) {} //C2664-Fehler
};

//----------------------------
//--main--
int main(int argc, char *argv[])
{
    ArrDlist* array = new ArrDlist();
    ArrDlistIt iter(array);
}
</code></pre>
<p>Allerdings bekomme ich eine Fehlermeldung, wenn ich im Konstruktor des Iterators versuche, den Basisklassenkonstruktor aufzurufen, obwohl ich den Typ der Template-Klasse spezifiziere und meineserachtens das auch richtig caste:</p>
<blockquote>
<p>dlist.hpp:41: Fehler:C2664: 'dListIt&lt;T&gt;::dListIt(dList&lt;T *&gt; *)': Konvertierung des Parameters 1 von 'dList&lt;T&gt; *' in 'dList&lt;T&gt; *' nicht m”glich<br />
with<br />
[<br />
T=DNode *<br />
]<br />
Die Typen, auf die verwiesen wird, sind nicht verknpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.</p>
</blockquote>
<p>Ich verstehe den Fehler nicht wirklich, da ich den Typ der abgeleiteten Templateklasse bei der Vererbung definiert, also damit initialisiert habe.</p>
<p>Oder ist generell bei Template-Klassen der Aufruf der Basisklassen-Methoden nicht möglich, so dass ich die Methoden immer in der erbenden Klasse überschreiben muss?</p>
<p>Vielen Dank schon mal für eure Hilfe.</p>
<p>Viele Grüße,</p>
<p>Tobias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2325822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2325822</guid><dc:creator><![CDATA[Sir_Tobias]]></dc:creator><pubDate>Fri, 24 May 2013 15:11:44 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: reinterpret_cast auf initialisierte Template-Basis-Klasse schlägt fehl on Fri, 24 May 2013 15:43:24 GMT]]></title><description><![CDATA[<p>Möchtest du nicht eher von <code>dList&lt;DNode&gt;</code> , bzw. <code>dListIt&lt;DNode&gt;</code> ableiten?</p>
<p>Sieh dir mal die Definition des Konstruktors der Spezialisierung <code>dListIt&lt;DNode*&gt;</code> an:</p>
<pre><code>dListIt(dList&lt;DNode**&gt; *t) : QListIterator&lt;DNode**&gt; (*t) { toFront(); }
</code></pre>
<p>Du rufst ihn aber auf mit</p>
<pre><code>dListIt&lt;DNode*&gt;( reinterpret_cast&lt;dList&lt;DNode*&gt;*&gt; (p) )
</code></pre>
<p>Das <code>reinterpret_cast</code> brauchst du hier nicht. Sobald die Typen endlich stimmen, passieren upcasts wie gewohnt implizit.<br />
Übrigens, die Bezeichnung ist Klassentemplate, nicht Template-Klasse. <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/2325829</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2325829</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 24 May 2013 15:43:24 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: reinterpret_cast auf initialisierte Template-Basis-Klasse schlägt fehl on Fri, 24 May 2013 15:36:54 GMT]]></title><description><![CDATA[<pre><code>//Ableitung von QListIterator
template &lt;class T&gt; class dListIt : public QListIterator&lt;T*&gt; {
public:
   dListIt(dList&lt;T*&gt; *t) : QListIterator&lt;T*&gt; (*t) { toFront(); }
};
</code></pre>
<p>toFront() ist vermutlich eine Memberfunktion der Basis. Dann muss dieser Aufruf qualifiziert (QListIterator&lt;T*&gt;::toFront()) oder ahängig (für ADL z.B. this-&gt;toFront() ) erfolgen.</p>
<p>Wie Sone schon gesagt hat, hat sich vermutlich irgendwo ein * zuviel eingeschlichen.<br />
reinterpret_cast ist <em>immer</em> falsch, wenn innerhalb von Klassenhierarchien gecastet werden soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2325836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2325836</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 24 May 2013 15:36:54 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: reinterpret_cast auf initialisierte Template-Basis-Klasse schlägt fehl on Fri, 24 May 2013 15:53:15 GMT]]></title><description><![CDATA[<blockquote>
<p>Oder ist generell bei Template-Klassen der Aufruf der Basisklassen-Methoden nicht möglich[...]?</p>
</blockquote>
<p>NA gut, das habe ich halb falsch erklärt.</p>
<p>Angenommen du hast ein Klassentemplate <code>A</code> .<br />
Und dann hast du ein Klassentemplate <code>B</code> , das von einer Spezialisierung von <code>A</code> ableitet die von einem Template-Parameter von <code>B</code> abhängt, bzw. die template-id die man im base-specifier angibt ist ein dependent-name.<br />
Um dann alle Member von der Basisklasse A&lt;...&gt; ohne weitere Qualifizierung (wie camper gezeigt hat) nutzen zu können, muss man jede nicht-statische Memberfunktion mit</p>
<pre><code>using A&lt;...&gt;::foo; // foo ist der Name der Funktion
</code></pre>
<p>und jeden inneren Typ von A (typedefs, usw.) mit</p>
<pre><code>using typename A&lt;...&gt;::bar;
</code></pre>
<p>deklarieren.</p>
<p>Beispiel:</p>
<pre><code>template&lt;typename T&gt;
struct Foo
{
    void bar(){} // Dummy
    typedef T DerTyp; // Dummy-Typedef
};

template&lt;typename T&gt;
struct FooFoo : Foo&lt;T&gt;
{
    /// Kommentiere eine dieser using-Deklarationen aus, und sieh was passiert
    using Foo&lt;int&gt;::bar;
    using typename Foo&lt;T&gt;::DerTyp;

    FooFoo()
    {
        bar();
        DerTyp dieVariable;
    }
};

int main()
{
    FooFoo&lt;int&gt; b;
}
</code></pre>
<p>Edit: Gleich kommt sowieso wieder camper. :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2325841</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2325841</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 24 May 2013 15:53:15 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: reinterpret_cast auf initialisierte Template-Basis-Klasse schlägt fehl on Fri, 24 May 2013 15:58:54 GMT]]></title><description><![CDATA[<p>Hier ist der Standard dazu:</p>
<p>N3337 [temp.dep]/3 schrieb:</p>
<blockquote>
<p>In the definition of a class or class template, if a base class depends on a template-parameter, the base class<br />
scope is not examined during unqualified name lookup either at the point of definition of the class template<br />
or member or during an instantiation of the class template or member.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2325846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2325846</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 24 May 2013 15:58:54 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: reinterpret_cast auf initialisierte Template-Basis-Klasse schlägt fehl on Tue, 28 May 2013 07:56:05 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>vielen Dank für die schnellen Antworten. Das hat mir sehr geholfen.</p>
<p>Es war wirklich eine Dereferenzierung zuviel. Das Ableiten von</p>
<pre><code>class ArrDlist: public dList&lt;DNode&gt;{
...
}
</code></pre>
<p>reicht völlig.</p>
<p>Vielen Dank auch für das hilfreiche Beispiel.</p>
<p>Viele Grüße,</p>
<p>Tobias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2326733</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2326733</guid><dc:creator><![CDATA[Sir_Tobias]]></dc:creator><pubDate>Tue, 28 May 2013 07:56:05 GMT</pubDate></item></channel></rss>