<?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[Zeiger auf geerbtes, templateparameterabhängiges Memberobjekt [erledigt]]]></title><description><![CDATA[<p>Folgender kurzer Code:</p>
<pre><code class="language-cpp">template &lt;typename T&gt; struct foo
{
  T data;
};

template&lt;typename T&gt; struct bar: public foo&lt;T&gt;
{
  typedef foo&lt;T&gt; Super;
  void some_func()
  {
    T* ptr = &amp; (Super::data);    
  }
};

int main()
{
  bar&lt;int&gt; b; 
  b.some_func();
}
</code></pre>
<p>Gibt den Fehler:</p>
<pre><code>11: error: cannot convert ‘int foo&lt;int&gt;::*’ to ‘int*’ in initialization
</code></pre>
<p><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="😕"
    /><br />
Wie kann der Compiler aus dem Ausdruck <code>&amp;(Super::data)</code> etwas vom Typ <code>‘int foo&lt;int&gt;::*’</code> herauslesen? Mir ist klar, dass ich auch einfach <code>&amp;(this-&gt;data)</code> schreiben kann und dann geht's, aber ich möchte wissen, warum meine Schreibweise nicht funktioniert.</p>
<p>Wenn ich das 1:1 ohne die Templates mache, geht das schließlich auch:</p>
<pre><code class="language-cpp">struct foo
{
  int data;
};

struct bar: public foo
{
  typedef foo Super;
  void some_func()
  {
    int* ptr = &amp; (Super::data);    
  }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/285084/zeiger-auf-geerbtes-templateparameterabhängiges-memberobjekt-erledigt</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 12:29:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/285084.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 13 Apr 2011 17:28:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeiger auf geerbtes, templateparameterabhängiges Memberobjekt [erledigt] on Wed, 13 Apr 2011 17:52:18 GMT]]></title><description><![CDATA[<p>Folgender kurzer Code:</p>
<pre><code class="language-cpp">template &lt;typename T&gt; struct foo
{
  T data;
};

template&lt;typename T&gt; struct bar: public foo&lt;T&gt;
{
  typedef foo&lt;T&gt; Super;
  void some_func()
  {
    T* ptr = &amp; (Super::data);    
  }
};

int main()
{
  bar&lt;int&gt; b; 
  b.some_func();
}
</code></pre>
<p>Gibt den Fehler:</p>
<pre><code>11: error: cannot convert ‘int foo&lt;int&gt;::*’ to ‘int*’ in initialization
</code></pre>
<p><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="😕"
    /><br />
Wie kann der Compiler aus dem Ausdruck <code>&amp;(Super::data)</code> etwas vom Typ <code>‘int foo&lt;int&gt;::*’</code> herauslesen? Mir ist klar, dass ich auch einfach <code>&amp;(this-&gt;data)</code> schreiben kann und dann geht's, aber ich möchte wissen, warum meine Schreibweise nicht funktioniert.</p>
<p>Wenn ich das 1:1 ohne die Templates mache, geht das schließlich auch:</p>
<pre><code class="language-cpp">struct foo
{
  int data;
};

struct bar: public foo
{
  typedef foo Super;
  void some_func()
  {
    int* ptr = &amp; (Super::data);    
  }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2048901</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048901</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 13 Apr 2011 17:52:18 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf geerbtes, templateparameterabhängiges Memberobjekt [erledigt] on Wed, 13 Apr 2011 17:47:18 GMT]]></title><description><![CDATA[<p>Der Compiler interpretiert das fälschlicherweise als &quot;Pointer-to-member&quot;, ähnlich wie ein Memberfunktionszeiger. Der speichert den relativen Offset zur Klasse, für den Zugriff benötigst du ein Objekt.</p>
<p>Soweit ich weiss, ist aber <code>&amp; (Super::data)</code> für einen Pointer-to-member syntaktisch nicht korrekt, die Klammern dürfen nicht stehen. Der Code mit Klammern sollte also funktionieren, unter MSVC++ und Comeau Online tut er das auch. Ich vermute einen Compilerbug in g++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048911</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 13 Apr 2011 17:47:18 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf geerbtes, templateparameterabhängiges Memberobjekt [erledigt] on Wed, 13 Apr 2011 17:51:57 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Der Compiler interpretiert das fälschlicherweise als &quot;Pointer-to-member&quot;, ähnlich wie ein Memberfunktionszeiger. Der speichert den relativen Offset zur Klasse, für den Zugriff benötigst du ein Objekt.</p>
<p>Soweit ich weiss, ist aber <code>&amp; (Super::data)</code> für einen Pointer-to-member syntaktisch nicht korrekt, die Klammern dürfen nicht stehen. Der Code mit Klammern sollte also funktionieren, unter MSVC++ und Comeau Online tut er das auch. Ich vermute einen Compilerbug in g++.</p>
</blockquote>
<p>Danke für den Test auf anderen Compilern. Ich war schon sehr verwirrt, wie der zu dieser Interpretation kommt. Ich habe auch mal den intel-Compiler drauf losgelassen und der schluckt es auch. Hätte ich vielleicht gleich tun sollen, aber eigentlich gehe ich bei Standardfragen immer davon aus, dass eher der g++ recht hat :p .</p>
<p>Dann ist das Thema wohl schon erledigt und ich werde mal einen Bugreport aufsetzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2048919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2048919</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 13 Apr 2011 17:51:57 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf geerbtes, templateparameterabhängiges Memberobjekt [erledigt] on Thu, 14 Apr 2011 09:47:30 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Soweit ich weiss, ist aber <code>&amp; (Super::data)</code> für einen Pointer-to-member syntaktisch nicht korrekt, die Klammern dürfen nicht stehen.</p>
</blockquote>
<p>Das kann ich übrigens nach etwas Standardlesen bestätigen. Die Passage ist sogar extrem eindeutig:</p>
<p>C++ Standard 5.3.1-3 schrieb:</p>
<blockquote>
<p>A pointer to member is only formed when an explicit &amp; is used and its operand is a qualified-id not enclosed in parentheses. [ Note: that is, <strong>the expression &amp;(qualified-id), where the qualified-id is enclosed in parentheses, does not form an expression of type “pointer to member.”</strong> Neither does qualified-id, because there is no implicit conversion from a qualified-id for a non-static member function to the type “pointer to member function” as there is from an lvalue of function type to the type “pointer to function” (4.3). Nor is &amp;unqualified-id pointer to member, even within the scope of the unqualified-id’s class. — end note ]</p>
</blockquote>
<p>Hervorhebung durch mich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2049213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2049213</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 14 Apr 2011 09:47:30 GMT</pubDate></item></channel></rss>