<?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[Datenmember als Nicht-Typ-Templateparameter innerhalb der eigenen Klasse]]></title><description><![CDATA[<p>Folgendes funktioniert problemlos:</p>
<pre><code class="language-cpp">struct A;

template&lt;int (A::*)&gt;
struct test {};

struct A
{
    int foo;
};

int main()
{
    test&lt;&amp;A::foo&gt; x;
}
</code></pre>
<p>Wenn ich aber die Dekleration von <code>x</code> in A reinnehmen will, geht es nicht mehr (MSVC 2010). Also</p>
<pre><code class="language-cpp">struct A;

template&lt;int (A::*)&gt;
struct test {};

struct A
{
    int foo;
    test&lt;&amp;A::foo&gt; x; // &lt;-- Fehler
};

int main() {}
</code></pre>
<p>Die Fehlermeldung ist wenig hilfreich:</p>
<pre><code>1&gt;...\main.cpp(9): error C2327: 'A::foo': Ist kein Typname, nicht statisch und kein Enumerator
1&gt;...\main.cpp(9): error C2065: 'foo': nichtdeklarierter Bezeichner
</code></pre>
<p>Das beispiel funktioniert, wenn <code>foo</code> eine Funktion ist (natürlich bei entsprechender Anpassung der Templateparameter von <code>test</code> ).</p>
<p>Hat irgendwer eine Erklärung dafür? Ist das im Standard so vorgeschrieben? (ich möchte mal nicht gleich von einem Bug im Visual Studio ausgehen).<br />
Ich könnte mir das so erklären, dass <code>&amp;A::foo</code> ja ein Offset darstellt und der Compiler das zum Zeitpunkt der Dekleration eventuell noch nicht wissen kann, da eventuell danach eine virtuelle Funktion kommen könnte und sich somit das Offset um den vptr verschieben würde. Aber gut, dann muss er eben dahinter gucken. Selbstverständlich bleibt der Fehler auch, wenn ich davor eine virtuelle Funktion definiere.<br />
Ansonsten hab ich aber keine wirkliche Erklärung für das Verhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/279442/datenmember-als-nicht-typ-templateparameter-innerhalb-der-eigenen-klasse</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 15:21:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/279442.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 27 Dec 2010 03:24:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Datenmember als Nicht-Typ-Templateparameter innerhalb der eigenen Klasse on Mon, 27 Dec 2010 03:24:27 GMT]]></title><description><![CDATA[<p>Folgendes funktioniert problemlos:</p>
<pre><code class="language-cpp">struct A;

template&lt;int (A::*)&gt;
struct test {};

struct A
{
    int foo;
};

int main()
{
    test&lt;&amp;A::foo&gt; x;
}
</code></pre>
<p>Wenn ich aber die Dekleration von <code>x</code> in A reinnehmen will, geht es nicht mehr (MSVC 2010). Also</p>
<pre><code class="language-cpp">struct A;

template&lt;int (A::*)&gt;
struct test {};

struct A
{
    int foo;
    test&lt;&amp;A::foo&gt; x; // &lt;-- Fehler
};

int main() {}
</code></pre>
<p>Die Fehlermeldung ist wenig hilfreich:</p>
<pre><code>1&gt;...\main.cpp(9): error C2327: 'A::foo': Ist kein Typname, nicht statisch und kein Enumerator
1&gt;...\main.cpp(9): error C2065: 'foo': nichtdeklarierter Bezeichner
</code></pre>
<p>Das beispiel funktioniert, wenn <code>foo</code> eine Funktion ist (natürlich bei entsprechender Anpassung der Templateparameter von <code>test</code> ).</p>
<p>Hat irgendwer eine Erklärung dafür? Ist das im Standard so vorgeschrieben? (ich möchte mal nicht gleich von einem Bug im Visual Studio ausgehen).<br />
Ich könnte mir das so erklären, dass <code>&amp;A::foo</code> ja ein Offset darstellt und der Compiler das zum Zeitpunkt der Dekleration eventuell noch nicht wissen kann, da eventuell danach eine virtuelle Funktion kommen könnte und sich somit das Offset um den vptr verschieben würde. Aber gut, dann muss er eben dahinter gucken. Selbstverständlich bleibt der Fehler auch, wenn ich davor eine virtuelle Funktion definiere.<br />
Ansonsten hab ich aber keine wirkliche Erklärung für das Verhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999176</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Mon, 27 Dec 2010 03:24:27 GMT</pubDate></item><item><title><![CDATA[Reply to Datenmember als Nicht-Typ-Templateparameter innerhalb der eigenen Klasse on Mon, 27 Dec 2010 09:36:48 GMT]]></title><description><![CDATA[<p>G++ 4.4.5 (ohne -std=c++0x) und <a href="http://www.comeaucomputing.com/tryitout/" rel="nofollow">http://www.comeaucomputing.com/tryitout/</a> (ebenfalls ohne 0x) nehmen auch die zweite Version anstandslos.</p>
<p>Was der Bill da zu meckern hat, versteh ich nicht. <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/1999197</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999197</guid><dc:creator><![CDATA[Dobias]]></dc:creator><pubDate>Mon, 27 Dec 2010 09:36:48 GMT</pubDate></item></channel></rss>