<?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[T C::* zu habgierig?]]></title><description><![CDATA[<p>folgender Code:</p>
<pre><code class="language-cpp">struct X { int a; int f(); };
void foo(int X::*) {}
template&lt;typename T, typename C&gt; void foo2(T C::*) {}
void bar()
{
    foo(&amp;X::a);
    foo2(&amp;X::a);
    foo(&amp;X::f);         // geht schief
    foo2(&amp;X::f);        // sollte auch schiefgehen, tut es aber nicht
}
</code></pre>
<p>Eigentlich erwarte ich, dass der Compiler hier ein Problem wie angegeben findet. Visual C++ 2005 und Comeau C++ sind da allerdings anderer Meinung. Gibts einen anderen Weg der Deklaration (d.h. ohne noch eine Überladung für Memberfunktionen anbieten zu müssen oder etwas anderes Umständliches - das wäre ja kein Problem), so dass die Funktion wirklich nur für Zeiger auf Member existiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/189697/t-c-zu-habgierig</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 09:46:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/189697.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 15 Aug 2007 22:06:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to T C::* zu habgierig? on Wed, 15 Aug 2007 22:55:26 GMT]]></title><description><![CDATA[<p>folgender Code:</p>
<pre><code class="language-cpp">struct X { int a; int f(); };
void foo(int X::*) {}
template&lt;typename T, typename C&gt; void foo2(T C::*) {}
void bar()
{
    foo(&amp;X::a);
    foo2(&amp;X::a);
    foo(&amp;X::f);         // geht schief
    foo2(&amp;X::f);        // sollte auch schiefgehen, tut es aber nicht
}
</code></pre>
<p>Eigentlich erwarte ich, dass der Compiler hier ein Problem wie angegeben findet. Visual C++ 2005 und Comeau C++ sind da allerdings anderer Meinung. Gibts einen anderen Weg der Deklaration (d.h. ohne noch eine Überladung für Memberfunktionen anbieten zu müssen oder etwas anderes Umständliches - das wäre ja kein Problem), so dass die Funktion wirklich nur für Zeiger auf Member existiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1345337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1345337</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 15 Aug 2007 22:55:26 GMT</pubDate></item><item><title><![CDATA[Reply to T C::* zu habgierig? on Thu, 16 Aug 2007 20:35:55 GMT]]></title><description><![CDATA[<p>Nö, das geht schon OK. Obwohl ich auch erstmal Augen machte als mein VC 2005 SP1 das gefressen hat.<br />
T ist in dem Fall dann einfach &quot;int __thiscall(void)&quot; <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> :</p>
<pre><code class="language-cpp">struct X
{
	int f(){return 42;}
};

template&lt;typename T, typename C&gt; void test(T C::*)
{
	printf(&quot;T: %s\n&quot;, typeid(T).name());
} 

int main() 
{ 
    test(&amp;X::f);        // passt schon so, ist nur aufn ersten blick nicht erkennbar wenn man noch nicht weiss was passieren wird
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1345435</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1345435</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 16 Aug 2007 20:35:55 GMT</pubDate></item><item><title><![CDATA[Reply to T C::* zu habgierig? on Thu, 16 Aug 2007 01:01:19 GMT]]></title><description><![CDATA[<p>Ja aber bist du da vollkommen abgesichert? Du hast ja eben noch den int dort. Was ist wenn da ein std::string in der struct steht? Meiner Meinung brauchst du noch einen Parameter, der dir die typisierte strukture übergibt. Oder spielt da der Retourparameter keine Rolle?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1345441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1345441</guid><dc:creator><![CDATA[WeaponX2007]]></dc:creator><pubDate>Thu, 16 Aug 2007 01:01:19 GMT</pubDate></item><item><title><![CDATA[Reply to T C::* zu habgierig? on Thu, 16 Aug 2007 05:38:42 GMT]]></title><description><![CDATA[<p>Der gcc frisst das zumindest nicht.</p>
<p>der sagt bei hustbaers beispiel:</p>
<blockquote>
<p>test.cpp:17: error: no matching function for call to `test(int (X::*)())'</p>
</blockquote>
<p>ich vermute hier eine nonstandard extension beim vc</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1345459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1345459</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Thu, 16 Aug 2007 05:38:42 GMT</pubDate></item><item><title><![CDATA[Reply to T C::* zu habgierig? on Thu, 16 Aug 2007 11:19:05 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>Der gcc frisst das zumindest nicht.</p>
<p>der sagt bei hustbaers beispiel:</p>
<blockquote>
<p>test.cpp:17: error: no matching function for call to `test(int (X::*)())'</p>
</blockquote>
<p>ich vermute hier eine nonstandard extension beim vc</p>
</blockquote>
<p>Das hatte ich auch gedacht (eher ein Compilerbug - denn Erweiterungen hab ich abgeschaltet) aber auch der Online Comeau Compiler nimmt es in allen Versionen. Es ist auch recht nutzlos, denn mit dem übergebenen Pointer selbst kann ich nicht sinnvoll weiterarbeiten. Es wird noch besser:</p>
<pre><code class="language-cpp">foo2&lt;int&gt;(&amp;X::f);
    foo2&lt;int,X&gt;(&amp;X::f);
</code></pre>
<p>werden beide abgelehnt. Scheint also doch ein Bug sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1345659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1345659</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 16 Aug 2007 11:19:05 GMT</pubDate></item><item><title><![CDATA[Reply to T C::* zu habgierig? on Thu, 16 Aug 2007 11:56:04 GMT]]></title><description><![CDATA[<p>Sorry muss mich hier mal anhängen.</p>
<p>Verstehe nämlich die Syntax und deren Zweck nicht.</p>
<p>Was soll denn dieser Code bewirken?<br />
Habe mir das Beispiel gebastelt.</p>
<pre><code class="language-cpp">struct Test
{
   int a;
   void f();
};

void foo(int Test::* b) // was ist denn das für ein Paramter????
{
   std::cout &lt;&lt; b;
}

int _tmain(int argc, _TCHAR* argv[])
{
   foo(&amp;Test::a);
}
</code></pre>
<p>Bei mir kommt 1 raus ???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1345702</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1345702</guid><dc:creator><![CDATA[templäd]]></dc:creator><pubDate>Thu, 16 Aug 2007 11:56:04 GMT</pubDate></item><item><title><![CDATA[Reply to T C::* zu habgierig? on Thu, 16 Aug 2007 12:02:09 GMT]]></title><description><![CDATA[<p>Muss mich korrigieren: es müsste</p>
<pre><code class="language-cpp">foo2&lt;int(),X&gt;(&amp;X::f);
</code></pre>
<p>heißen und das funktioniert dann auch. Muss ich für meine Zwecke eben doch nochmal nur für Zeiger auf Memberfunktionen spezialisieren. Es gibt ja einen ähnlichen Fall, wo ein einfacher Funktionstyp für Memberfunktionen benutzt wird:</p>
<pre><code class="language-cpp">typedef void foo();
struct X {
    foo bar; // deklariert die nichtstatische Memberfunktion void X::bar()
};
</code></pre>
<p>sehr unintuitiv - imo hätte man das anders lösen sollen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1345706</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1345706</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 16 Aug 2007 12:02:09 GMT</pubDate></item><item><title><![CDATA[Reply to T C::* zu habgierig? on Thu, 16 Aug 2007 12:06:07 GMT]]></title><description><![CDATA[<p>@templäd<br />
das ist auch nicht die richtige nutzung.</p>
<p>man nutzt den zeiger eigentlich für sowas:</p>
<pre><code class="language-cpp">template&lt;class Class, class Type&gt;
void foo(const Class&amp; object,int Class::* memberpointer)
{
     std::cout&lt;&lt;object.*memberpointer;
};

struct Test
{
    int bar;
};

int main()
{
    Test test;
    test.bar=35;
    foo(test,&amp;Test::bar);
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1345708</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1345708</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Thu, 16 Aug 2007 12:06:07 GMT</pubDate></item><item><title><![CDATA[Reply to T C::* zu habgierig? on Thu, 16 Aug 2007 12:57:38 GMT]]></title><description><![CDATA[<p>@templäd: Memberfunktionspointer können implizit in bool konvertiert werden (Ergebnis entspricht dem Vergleich mit einem Nullpointer dieses Typs). Und für bool existiert eine Überladung des Operators &lt;&lt; mit ostream...</p>
<p>dein</p>
<pre><code class="language-cpp">foo(&amp;Test::a);
</code></pre>
<p>ist daher so etwas wie:</p>
<pre><code class="language-cpp">std::cout &lt;&lt; (&amp;Test::a != 0);
</code></pre>
<p>und da kommt natürlich true (1) heraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1345748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1345748</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 16 Aug 2007 12:57:38 GMT</pubDate></item></channel></rss>