<?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[adresse einer virtuellen memberfunktion als template-parameter für einen member]]></title><description><![CDATA[<p>Ich hoffe der Titel hat niemandem Kopfschmerzen bereitet.</p>
<p>Es dreht sich um folgendes:</p>
<p>Ich möchte die Adresse einer virtuellen Memberfunktion einer Klasse als Templateparameter für einen Member dieser Klasse benutzen, was unter dem C++ Compiler von VS2005 einen internen Kompilierfehler verursacht.</p>
<p>Vermutlich sagt das Codebeispiel unten mehr aus als jede Worte darüber es je könnten.</p>
<pre><code class="language-cpp">template&lt;class T, void(T::*F)()&gt;
struct foo 
{
};

struct bar
{
	virtual void something()
	{
	}

	foo&lt;bar, &amp;bar::something&gt; blub;	
};

int main()
{
	return 0;
}
</code></pre>
<p>GCC kompiliert den Code problemlos, bei VS2005 gibts diesen netten internen Kompilierfehler:</p>
<pre><code>...\main.cpp(3) : fatal error C1001: Interner Compilerfehler.
(Compilerdatei &quot;msc1.cpp&quot;, Zeile 1393)
 Vereinfachen oder ändern Sie das Programm im Umfeld der oben aufgeführten Positionen. Wählen 
Sie im Menü &quot;Hilfe&quot; von Visual C++ den Befehl &quot;Technischer Support&quot;, 
oder öffnen Sie die Hilfedatei des technischen Supports, um weitere Informationen zu erhalten.
</code></pre>
<p>Interessanterweise funktioniert es problemlos, wenn:<br />
- Die Funktion nicht virtuell ist.<br />
oder<br />
- blub kein Datenmember von bar ist.</p>
<p>Was auch möglich ist, ist eine nicht-virtuelle Funktion zu schreiben, die die virtuelle Aufruft und diese dann als Templateparameter zu benutzten.</p>
<p>Jetzt zu meiner Frage:<br />
Hat jemand eine kluge Idee für einen schöneren Workaround als eine Wrapper-Funktion?<br />
Kann es sein, dass ein Kompiler den obrigen Code garnicht erst kompilieren muss? Ist es vielleicht nicht erlaubt die Adresse einer virtuellen Memberfunktion als Templateparameter für Datenmember zu benutzen?<br />
Kommentare? Ideen? Anregungen?</p>
<p>Falls sich jemand fragt, wozu zum Teufel man sowas braucht:<br />
<a href="http://boost-sandbox.cvs.sourceforge.net/boost-sandbox/boost-sandbox/libs/property/test/object_properties.cpp?revision=1.2&amp;view=markup" rel="nofollow">http://boost-sandbox.cvs.sourceforge.net/boost-sandbox/boost-sandbox/libs/property/test/object_properties.cpp?revision=1.2&amp;view=markup</a></p>
<p>Im Grunde ist das Problem hier nur vereinfacht dargestellt.</p>
<p>Gruß, pyrokar <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/189900/adresse-einer-virtuellen-memberfunktion-als-template-parameter-für-einen-member</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 13:24:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/189900.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 18 Aug 2007 11:43:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to adresse einer virtuellen memberfunktion als template-parameter für einen member on Sat, 18 Aug 2007 11:43:51 GMT]]></title><description><![CDATA[<p>Ich hoffe der Titel hat niemandem Kopfschmerzen bereitet.</p>
<p>Es dreht sich um folgendes:</p>
<p>Ich möchte die Adresse einer virtuellen Memberfunktion einer Klasse als Templateparameter für einen Member dieser Klasse benutzen, was unter dem C++ Compiler von VS2005 einen internen Kompilierfehler verursacht.</p>
<p>Vermutlich sagt das Codebeispiel unten mehr aus als jede Worte darüber es je könnten.</p>
<pre><code class="language-cpp">template&lt;class T, void(T::*F)()&gt;
struct foo 
{
};

struct bar
{
	virtual void something()
	{
	}

	foo&lt;bar, &amp;bar::something&gt; blub;	
};

int main()
{
	return 0;
}
</code></pre>
<p>GCC kompiliert den Code problemlos, bei VS2005 gibts diesen netten internen Kompilierfehler:</p>
<pre><code>...\main.cpp(3) : fatal error C1001: Interner Compilerfehler.
(Compilerdatei &quot;msc1.cpp&quot;, Zeile 1393)
 Vereinfachen oder ändern Sie das Programm im Umfeld der oben aufgeführten Positionen. Wählen 
Sie im Menü &quot;Hilfe&quot; von Visual C++ den Befehl &quot;Technischer Support&quot;, 
oder öffnen Sie die Hilfedatei des technischen Supports, um weitere Informationen zu erhalten.
</code></pre>
<p>Interessanterweise funktioniert es problemlos, wenn:<br />
- Die Funktion nicht virtuell ist.<br />
oder<br />
- blub kein Datenmember von bar ist.</p>
<p>Was auch möglich ist, ist eine nicht-virtuelle Funktion zu schreiben, die die virtuelle Aufruft und diese dann als Templateparameter zu benutzten.</p>
<p>Jetzt zu meiner Frage:<br />
Hat jemand eine kluge Idee für einen schöneren Workaround als eine Wrapper-Funktion?<br />
Kann es sein, dass ein Kompiler den obrigen Code garnicht erst kompilieren muss? Ist es vielleicht nicht erlaubt die Adresse einer virtuellen Memberfunktion als Templateparameter für Datenmember zu benutzen?<br />
Kommentare? Ideen? Anregungen?</p>
<p>Falls sich jemand fragt, wozu zum Teufel man sowas braucht:<br />
<a href="http://boost-sandbox.cvs.sourceforge.net/boost-sandbox/boost-sandbox/libs/property/test/object_properties.cpp?revision=1.2&amp;view=markup" rel="nofollow">http://boost-sandbox.cvs.sourceforge.net/boost-sandbox/boost-sandbox/libs/property/test/object_properties.cpp?revision=1.2&amp;view=markup</a></p>
<p>Im Grunde ist das Problem hier nur vereinfacht dargestellt.</p>
<p>Gruß, pyrokar <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346828</guid><dc:creator><![CDATA[Pyr0kar]]></dc:creator><pubDate>Sat, 18 Aug 2007 11:43:51 GMT</pubDate></item><item><title><![CDATA[Reply to adresse einer virtuellen memberfunktion als template-parameter für einen member on Sat, 18 Aug 2007 13:28:49 GMT]]></title><description><![CDATA[<p>Ich kann im Standard nichts finden, das dieses Konstrukt verbietet - vermutlich hat der Compiler hier Schwierigkeiten, weil er die vtable für eine Klasse erst am Ende der Klassendefinition erstellt (reine Vermutung). Herumspielen mit /vmx Switches oder #pragmas scheint nichts zu bringen. Einen weiteren Workaround hab ich noch gefunden (compiliert, aber ungetested):</p>
<pre><code class="language-cpp">struct bar_base { virtual void something() { } }; // mit pure geht es nicht

struct bar : bar_base
{
    virtual void something()
    {
    }

    foo&lt;bar,static_cast&lt;void(bar::*)()&gt;(&amp;bar_base::something)&gt; blub;
};
</code></pre>
<p>edit: doch nicht legal, da das kein konstanter Ausruck mehr ist, aber msvc frisst es, keine Ahnung was g++ dazu sagt. vielleicht erfüllt</p>
<pre><code class="language-cpp">foo&lt;bar_base,&amp;bar_base::something&gt; blub;
</code></pre>
<p>ja auch den Zweck für dich</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346901</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346901</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 18 Aug 2007 13:28:49 GMT</pubDate></item><item><title><![CDATA[Reply to adresse einer virtuellen memberfunktion als template-parameter für einen member on Sat, 18 Aug 2007 13:21:38 GMT]]></title><description><![CDATA[<p>also bei mir wird dieses Konstrukt ohne Probleme von VC++ 2005 compiliert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346909</guid><dc:creator><![CDATA[Checker*amp*Murckser]]></dc:creator><pubDate>Sat, 18 Aug 2007 13:21:38 GMT</pubDate></item><item><title><![CDATA[Reply to adresse einer virtuellen memberfunktion als template-parameter für einen member on Sat, 18 Aug 2007 13:28:16 GMT]]></title><description><![CDATA[<p>Das obere?<br />
Mir hat das den VC2005 SP1 compiler abgeschossen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346915</guid><dc:creator><![CDATA[hth]]></dc:creator><pubDate>Sat, 18 Aug 2007 13:28:16 GMT</pubDate></item><item><title><![CDATA[Reply to adresse einer virtuellen memberfunktion als template-parameter für einen member on Sat, 18 Aug 2007 13:31:56 GMT]]></title><description><![CDATA[<p>hth schrieb:</p>
<blockquote>
<p>Das obere?<br />
Mir hat das den VC2005 SP1 compiler abgeschossen...</p>
</blockquote>
<p>echt? mir nicht<br />
ah halt - mir auch, wenn ich im Debugmodus compiliere - im Releasemodus passiert nix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346916</guid><dc:creator><![CDATA[Checker*amp*Murckser]]></dc:creator><pubDate>Sat, 18 Aug 2007 13:31:56 GMT</pubDate></item><item><title><![CDATA[Reply to adresse einer virtuellen memberfunktion als template-parameter für einen member on Sat, 18 Aug 2007 13:42:02 GMT]]></title><description><![CDATA[<p>stimmt: /Gm (Code Generation/Enable Minimal Rebuild) ist der schuldige Schalter</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346922</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346922</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 18 Aug 2007 13:42:02 GMT</pubDate></item><item><title><![CDATA[Reply to adresse einer virtuellen memberfunktion als template-parameter für einen member on Sat, 18 Aug 2007 13:45:00 GMT]]></title><description><![CDATA[<p>Der BCC (5.9) erzeugt bei obigem Beispiel auch einen ICE, und auch hier funktioniert es, wenn man die Deklaration von blub z.B. nach main() verschiebt (also trifft campers Vermutung wohl zu). Auch campers Workaround wird übersetzt.</p>
<p>Was den Nutzen angeht: solche Konstrukte wie diesen boost::property-Entwurf habe ich früher auch manchmal gebaut, aber abgesehen davon, daß es schön aussieht, ist der Nutzen ohne Möglichkeiten wie Reflection doch recht beschränkt, und zudem erhöht es lediglich den Speicherbedarf der Klasse wegen des in dem Property-Objekts gespeicherten this-Zeigers. Oder übersehe ich da etwas?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346924</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Sat, 18 Aug 2007 13:45:00 GMT</pubDate></item><item><title><![CDATA[Reply to adresse einer virtuellen memberfunktion als template-parameter für einen member on Sat, 18 Aug 2007 14:31:12 GMT]]></title><description><![CDATA[<p>Danke für die vielen aufschlussreichen Antworten, besonders an camper u. Checker&amp;Murckser.</p>
<p>Tatsächlich läuft es ohne /Gm problemlos durch.<br />
Genau so etwas hab ich gesucht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>audacia schrieb:</p>
<blockquote>
<p>...<br />
Was den Nutzen angeht: solche Konstrukte wie diesen boost::property-Entwurf habe ich früher auch manchmal gebaut, aber abgesehen davon, daß es schön aussieht, ist der Nutzen ohne Möglichkeiten wie Reflection doch recht beschränkt, und zudem erhöht es lediglich den Speicherbedarf der Klasse wegen des in dem Property-Objekts gespeicherten this-Zeigers. Oder übersehe ich da etwas?</p>
</blockquote>
<p>Stimmt, man könnte zwar noch ein paar mehr Spielereien mit den properties anstellen, aber der Hauptnutzen ist dass es schöner aussieht.</p>
<p>Ich finde halt sowas wie:</p>
<pre><code class="language-cpp">car.Speed += 20;
</code></pre>
<p>schon deutlich schöner als:</p>
<pre><code class="language-cpp">car.setSpeed(car.getSpeed() + 20);
</code></pre>
<p>Das ist mir als Programmierer den überflüssigen this-Zeiger etc. wert.</p>
<p>Die Frage beim Klassendesign, die hierbei natürlich aufkommt ist, ob man die get/set-Funktionen dann private macht damit der Nutzer nur das Property benutzen kann oder ob man sie public lässt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346951</guid><dc:creator><![CDATA[Pyr0kar]]></dc:creator><pubDate>Sat, 18 Aug 2007 14:31:12 GMT</pubDate></item><item><title><![CDATA[Reply to adresse einer virtuellen memberfunktion als template-parameter für einen member on Sat, 18 Aug 2007 14:39:43 GMT]]></title><description><![CDATA[<p>Verwirrenderweise gibt folgendes trotzdem deaktiviertem /Gm wieder einen Internen Kompilierfehler:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
struct wrapper
{
};

template&lt;class T, void(T::*F)()&gt;
struct foo 
{
};

struct bar
{
	virtual void something()
	{
	}

	wrapper&lt;
		foo&lt;bar, &amp;bar::something&gt;
	&gt; blub;
};

int main()
{
	return 0;
}
</code></pre>
<p>Es gilt wieder:<br />
- Macht man something nicht-virtuell, geht es.<br />
- Packt man blub außerhalb von bar, geht es ebenfalls.</p>
<p>Ein typedef für foo&lt;bar, &amp;bar::something&gt; löst das Problem leider nicht.</p>
<p>Wirklich komischer Compiler, dieser MSVC++.</p>
<p>Leider ist so etwas für die Benutzung von Boost.Property nötig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346954</guid><dc:creator><![CDATA[Pyr0kar]]></dc:creator><pubDate>Sat, 18 Aug 2007 14:39:43 GMT</pubDate></item><item><title><![CDATA[Reply to adresse einer virtuellen memberfunktion als template-parameter für einen member on Sat, 18 Aug 2007 17:04:08 GMT]]></title><description><![CDATA[<p>Der Workaround über die Basisklasse funktioniert offenbar nicht:</p>
<pre><code class="language-cpp">struct bar_base { virtual void something() {} };
struct bar : bar_base
{
    virtual void something()
    {
    }

};

#include&lt;iostream&gt;
int main()
{
    std::cout &lt;&lt; (&amp;bar::something==&amp;bar_base::something);  // gibt 1 aus
//    int x[&amp;bar::something==&amp;bar_base::something];  // geht schief
    return 0;
}
</code></pre>
<p>Diese Konvertierung während des Compilierens erfolgt offenbar nicht richtig und ist ohnehin nicht konform. Die Benutzung einer nichtvirtuellen Funktion dürfte die beste Lösung sein, das ist standardkonform und m.E. sowieso guter Stil.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1347018</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1347018</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 18 Aug 2007 17:04:08 GMT</pubDate></item><item><title><![CDATA[Reply to adresse einer virtuellen memberfunktion als template-parameter für einen member on Sat, 18 Aug 2007 17:17:20 GMT]]></title><description><![CDATA[<p>Ich wuerde trotzdem mal noch MS Bescheid sagen, damit die das fixen. Dafuer bezahlt man schliesslich denen auch das Geld. f'`8k</p>
<p><div class="plugin-markdown"><input type="checkbox" id="checkbox11757" /><label for="checkbox11757"></label></div><a href="http://tggc.tg.funpic.de/index.php?cat=8&amp;page=5" rel="nofollow">Autocogito</a></p>
<p>Gruß, TGGC (<a href="http://www.games-net.de/hosted/tggc" rel="nofollow">making great games since 1992</a>)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1347024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1347024</guid><dc:creator><![CDATA[TGGC]]></dc:creator><pubDate>Sat, 18 Aug 2007 17:17:20 GMT</pubDate></item><item><title><![CDATA[Reply to adresse einer virtuellen memberfunktion als template-parameter für einen member on Sat, 18 Aug 2007 17:44:44 GMT]]></title><description><![CDATA[<p>Pyr0kar schrieb:</p>
<blockquote>
<p>Das ist mir als Programmierer den überflüssigen this-Zeiger etc. wert.</p>
</blockquote>
<p>Auch den Laufzeitnachteil, der entsteht, weil die Funktion nicht inline generiert werden kann, da auf sie über einen Zeiger zugegriffen wird?</p>
<p>Eine eher unschöne, aber saubere Lösung dürfte übrigens folgendes sein:</p>
<pre><code class="language-cpp">template &lt;class T, void (T::*F) (void)&gt;
	struct foo
{};

struct bar
{
	virtual void func (void) { }

private:
	void func_wrapper (void) { func (); }

public:
	foo &lt;bar, &amp;bar::func_wrapper&gt; blub;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1347035</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1347035</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Sat, 18 Aug 2007 17:44:44 GMT</pubDate></item><item><title><![CDATA[Reply to adresse einer virtuellen memberfunktion als template-parameter für einen member on Sat, 18 Aug 2007 18:17:07 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>Eine eher unschöne, aber saubere Lösung dürfte übrigens folgendes sein:</p>
</blockquote>
<p>unschön, weil du public und private falsch gesetzt hast <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="😉"
    /> virtuelle Funktionen sollten sowieso nicht public sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1347044</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1347044</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 18 Aug 2007 18:17:07 GMT</pubDate></item><item><title><![CDATA[Reply to adresse einer virtuellen memberfunktion als template-parameter für einen member on Sun, 19 Aug 2007 11:22:57 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>virtuelle Funktionen sollten sowieso nicht public sein.</p>
</blockquote>
<p>??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1347294</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1347294</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Sun, 19 Aug 2007 11:22:57 GMT</pubDate></item><item><title><![CDATA[Reply to adresse einer virtuellen memberfunktion als template-parameter für einen member on Sun, 19 Aug 2007 11:24:22 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>virtuelle Funktionen sollten sowieso nicht public sein.</p>
</blockquote>
<p>??</p>
</blockquote>
<p>schließ mich an<br />
Wieso das denn? Ich hab die immer mit dem Sichtbarkeitsattribut versehen, was ich brauchte - auch public ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1347295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1347295</guid><dc:creator><![CDATA[Checker*amp*Murckser]]></dc:creator><pubDate>Sun, 19 Aug 2007 11:24:22 GMT</pubDate></item><item><title><![CDATA[Reply to adresse einer virtuellen memberfunktion als template-parameter für einen member on Mon, 20 Aug 2007 20:22:06 GMT]]></title><description><![CDATA[<p>*push*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348553</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Mon, 20 Aug 2007 20:22:06 GMT</pubDate></item><item><title><![CDATA[Reply to adresse einer virtuellen memberfunktion als template-parameter für einen member on Tue, 21 Aug 2007 05:39:36 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/8276">@audacia</a>:</p>
<p>camper schrieb:</p>
<blockquote>
<p>virtuelle Funktionen sollten sowieso nicht public sein.</p>
</blockquote>
<p>Das bezieht sich doch auf deinen Code, wo aber virtual-func() private ist. Aber camper sagt &quot;sollten sowieso&quot;, als ob du sie public hättest. Gehe mal deswegen davon aus das es nur ein vertipper war <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>
<p>Private virtuals machen nämlich nicht gerade viel Sinn ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348623</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 21 Aug 2007 05:39:36 GMT</pubDate></item><item><title><![CDATA[Reply to adresse einer virtuellen memberfunktion als template-parameter für einen member on Tue, 21 Aug 2007 05:50:19 GMT]]></title><description><![CDATA[<p>KasF schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/8276">@audacia</a>:</p>
<p>camper schrieb:</p>
<blockquote>
<p>virtuelle Funktionen sollten sowieso nicht public sein.</p>
</blockquote>
<p>Das bezieht sich doch auf deinen Code, wo aber virtual-func() private ist. Aber camper sagt &quot;sollten sowieso&quot;, als ob du sie public hättest. Gehe mal deswegen davon aus das es nur ein vertipper war <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>
</blockquote>
<p>Würde ich nicht von ausgehen <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>
<blockquote>
<p>Private virtuals machen nämlich nicht gerade viel Sinn ...</p>
</blockquote>
<p>In einem der Effectives steht was dazu drin. In der Tat machen private virtuals, die von public nonvirtuals aufgerufen werden, sehr viel Sinn.<br />
EDIT: Herby schreibt folgendes: <a href="http://www.gotw.ca/publications/mill18.htm" rel="nofollow">http://www.gotw.ca/publications/mill18.htm</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348627</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 21 Aug 2007 05:50:19 GMT</pubDate></item><item><title><![CDATA[Reply to adresse einer virtuellen memberfunktion als template-parameter für einen member on Tue, 21 Aug 2007 06:15:10 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<blockquote>
<p>Private virtuals machen nämlich nicht gerade viel Sinn ...</p>
</blockquote>
<p>In einem der Effectives steht was dazu drin. In der Tat machen private virtuals, die von public nonvirtuals aufgerufen werden, sehr viel Sinn.<br />
EDIT: Herby schreibt folgendes: <a href="http://www.gotw.ca/publications/mill18.htm" rel="nofollow">http://www.gotw.ca/publications/mill18.htm</a></p>
</blockquote>
<p>Achso ok. Ich lese mir das mal später bzw. im Buch nochmal durch, wenn ich *wacher* bin <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348635</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348635</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 21 Aug 2007 06:15:10 GMT</pubDate></item><item><title><![CDATA[Reply to adresse einer virtuellen memberfunktion als template-parameter für einen member on Tue, 21 Aug 2007 13:56:15 GMT]]></title><description><![CDATA[<p>KasF schrieb:</p>
<blockquote>
<p>Das bezieht sich doch auf deinen Code, wo aber virtual-func() private ist.</p>
</blockquote>
<p>virtual void func() ist public!</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10648">@LordJaxom</a>: danke für den Link, das dürfte camper wohl gemeint haben.<br />
Zwar kann ich ihn verstehen, aber ich teile Sutters Ansichten in dieser Frage nicht generell. In diesem Fall wäre es aber wohl besser, wie camper vorschlägt:</p>
<pre><code class="language-cpp">template &lt;class T, void (T::*F) (void)&gt;
    struct foo
{};

struct bar
{
private:
    virtual void func_impl (void) { }

public:
    void func (void) { func_impl (); }

public:
    foo &lt;bar, &amp;bar::func&gt; blub;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1349073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1349073</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Tue, 21 Aug 2007 13:56:15 GMT</pubDate></item><item><title><![CDATA[Reply to adresse einer virtuellen memberfunktion als template-parameter für einen member on Tue, 21 Aug 2007 14:04:08 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>KasF schrieb:</p>
<blockquote>
<p>Das bezieht sich doch auf deinen Code, wo aber virtual-func() private ist.</p>
</blockquote>
<p>virtual void func() ist public!</p>
</blockquote>
<p>Uuups, da steht ja struct. Sry <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1349078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1349078</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 21 Aug 2007 14:04:08 GMT</pubDate></item></channel></rss>