<?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[Kompilierfehler im Bsp. aus dem ACCU Artikel &amp;quot;Defining Visitors Inline in Modern C++&amp;quot;]]></title><description><![CDATA[<p>Ich habe den Code aus dem Artikel <a href="http://accu.org/index.php/articles/2021" rel="nofollow">Defining Visitors Inline in Modern C++</a> versucht einzubinden weil ich die Idee interessant finde.<br />
Mit Visual Studio 2013 läuft alles rund, mit dem gcc4.8.2 (auch 4.8.1) führt der Beispiel Code zu einem Kompilierfehler.</p>
<p><em>Edit:</em><br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> Ich vermute, dass es mit gcc Version 4.9.x funktioniert - zumindest sollte es das laut Artikel.<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> Ich vermutete falsch - auch mit gcc Version 4.9.2 führt es zu besagtem Kompilierfehler.</p>
<p>Den Code, abzüglich Fehler, aber inklusive der Fehlermeldung ist bei <a href="http://Ideone.com" rel="nofollow">Ideone.com</a> zu finden (<s>ich verzichte deshalb auf eine Wiederholung</s>):<br />
<a href="https://ideone.com/WLmPEs" rel="nofollow">https://ideone.com/WLmPEs</a></p>
<p>Ich verstehe nicht warum der Code dem gcc missfällt. Kann jemand mir - oder noch besser dem gcc - auf die Sprünge helfen?</p>
<p><em>Edit:</em><br />
Hier die nachbearbeitete Fehlermeldung (ich habe alle Lambdas und <code>std::pair&lt;..&gt;</code> s entfernt, da sie keine Rolle spielen).</p>
<blockquote>
<p>prog.cpp: In instantiation of ‘struct ComposeVisitor&lt;Triangle, .., EmptyVisitor&lt;PolygonVisitor&gt;::Inner, .. &gt;::Inner’:<br />
prog.cpp:45:12: required from ‘struct ComposeVisitor&lt;Square, .., ComposeVisitor&lt;Triangle, .., EmptyVisitor&lt;PolygonVisitor&gt;::Inner, .. &gt;::Inner, .. &gt; &gt;::Inner’<br />
prog.cpp:133:22: required from here<br />
prog.cpp:81:11: error: cannot allocate an object of abstract type ‘ComposeVisitor&lt;Triangle, .., EmptyVisitor&lt;PolygonVisitor&gt;::Inner, .. &gt;::Inner’<br />
Inner end_visitor()<br />
^<br />
prog.cpp:45:12: note: because the following virtual functions are pure within ‘ComposeVisitor&lt;Triangle, .., EmptyVisitor&lt;PolygonVisitor&gt;::Inner, .. &gt;::Inner’:<br />
struct Inner : public BaseInner<br />
^<br />
prog.cpp:15:18: note: virtual void PolygonVisitor::visit(Square&amp;)<br />
virtual void visit(Square&amp; sq) = 0;</p>
</blockquote>
<p>Dass <code>EmptyVisitor::Inner</code> von <code>VisitorBase</code> (= <code>PolygonVisitor</code> ) ableitet, aber keine der <code>visit(..)</code> Methoden überschreibt sollte doch auch zu Problemen führen - tut es aber zumindest und Visual Studio 2013 nicht. Vielleicht hat jemand eine Erklärung dafür?</p>
<p><em>Edit:</em><br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> Ok, <code>EmptyVisitor::Inner</code> stellt einfach die pure-virtual Methoden vom Visitor-Interface zur Verfügung (etwas prosaisch ausgedrückt).</p>
<p>Ausserdem bin ich an Alternativen interessiert?!? Loki scheint etwas in der Art zu bieten, allerdings möchte ich keine zusätzliche Abhängigkeit schaffen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/330306/kompilierfehler-im-bsp-aus-dem-accu-artikel-quot-defining-visitors-inline-in-modern-c-quot</link><generator>RSS for Node</generator><lastBuildDate>Fri, 03 Jul 2026 11:35:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/330306.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 02 Jan 2015 19:13:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kompilierfehler im Bsp. aus dem ACCU Artikel &amp;quot;Defining Visitors Inline in Modern C++&amp;quot; on Sat, 03 Jan 2015 12:12:05 GMT]]></title><description><![CDATA[<p>Ich habe den Code aus dem Artikel <a href="http://accu.org/index.php/articles/2021" rel="nofollow">Defining Visitors Inline in Modern C++</a> versucht einzubinden weil ich die Idee interessant finde.<br />
Mit Visual Studio 2013 läuft alles rund, mit dem gcc4.8.2 (auch 4.8.1) führt der Beispiel Code zu einem Kompilierfehler.</p>
<p><em>Edit:</em><br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> Ich vermute, dass es mit gcc Version 4.9.x funktioniert - zumindest sollte es das laut Artikel.<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> Ich vermutete falsch - auch mit gcc Version 4.9.2 führt es zu besagtem Kompilierfehler.</p>
<p>Den Code, abzüglich Fehler, aber inklusive der Fehlermeldung ist bei <a href="http://Ideone.com" rel="nofollow">Ideone.com</a> zu finden (<s>ich verzichte deshalb auf eine Wiederholung</s>):<br />
<a href="https://ideone.com/WLmPEs" rel="nofollow">https://ideone.com/WLmPEs</a></p>
<p>Ich verstehe nicht warum der Code dem gcc missfällt. Kann jemand mir - oder noch besser dem gcc - auf die Sprünge helfen?</p>
<p><em>Edit:</em><br />
Hier die nachbearbeitete Fehlermeldung (ich habe alle Lambdas und <code>std::pair&lt;..&gt;</code> s entfernt, da sie keine Rolle spielen).</p>
<blockquote>
<p>prog.cpp: In instantiation of ‘struct ComposeVisitor&lt;Triangle, .., EmptyVisitor&lt;PolygonVisitor&gt;::Inner, .. &gt;::Inner’:<br />
prog.cpp:45:12: required from ‘struct ComposeVisitor&lt;Square, .., ComposeVisitor&lt;Triangle, .., EmptyVisitor&lt;PolygonVisitor&gt;::Inner, .. &gt;::Inner, .. &gt; &gt;::Inner’<br />
prog.cpp:133:22: required from here<br />
prog.cpp:81:11: error: cannot allocate an object of abstract type ‘ComposeVisitor&lt;Triangle, .., EmptyVisitor&lt;PolygonVisitor&gt;::Inner, .. &gt;::Inner’<br />
Inner end_visitor()<br />
^<br />
prog.cpp:45:12: note: because the following virtual functions are pure within ‘ComposeVisitor&lt;Triangle, .., EmptyVisitor&lt;PolygonVisitor&gt;::Inner, .. &gt;::Inner’:<br />
struct Inner : public BaseInner<br />
^<br />
prog.cpp:15:18: note: virtual void PolygonVisitor::visit(Square&amp;)<br />
virtual void visit(Square&amp; sq) = 0;</p>
</blockquote>
<p>Dass <code>EmptyVisitor::Inner</code> von <code>VisitorBase</code> (= <code>PolygonVisitor</code> ) ableitet, aber keine der <code>visit(..)</code> Methoden überschreibt sollte doch auch zu Problemen führen - tut es aber zumindest und Visual Studio 2013 nicht. Vielleicht hat jemand eine Erklärung dafür?</p>
<p><em>Edit:</em><br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> Ok, <code>EmptyVisitor::Inner</code> stellt einfach die pure-virtual Methoden vom Visitor-Interface zur Verfügung (etwas prosaisch ausgedrückt).</p>
<p>Ausserdem bin ich an Alternativen interessiert?!? Loki scheint etwas in der Art zu bieten, allerdings möchte ich keine zusätzliche Abhängigkeit schaffen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2435807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2435807</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sat, 03 Jan 2015 12:12:05 GMT</pubDate></item><item><title><![CDATA[Reply to Kompilierfehler im Bsp. aus dem ACCU Artikel &amp;quot;Defining Visitors Inline in Modern C++&amp;quot; on Fri, 02 Jan 2015 19:26:18 GMT]]></title><description><![CDATA[<p>Bevor ich's mir anschau: Ich tippe auf ill-formed NDR.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2435809</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2435809</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Fri, 02 Jan 2015 19:26:18 GMT</pubDate></item><item><title><![CDATA[Reply to Kompilierfehler im Bsp. aus dem ACCU Artikel &amp;quot;Defining Visitors Inline in Modern C++&amp;quot; on Sat, 03 Jan 2015 13:07:55 GMT]]></title><description><![CDATA[<p>Aktueller Workaround für mich:<br />
Die Methoden im Visitor nicht pure-virtual, sondern nur virtual machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2435860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2435860</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sat, 03 Jan 2015 13:07:55 GMT</pubDate></item><item><title><![CDATA[Reply to Kompilierfehler im Bsp. aus dem ACCU Artikel &amp;quot;Defining Visitors Inline in Modern C++&amp;quot; on Sat, 03 Jan 2015 15:17:40 GMT]]></title><description><![CDATA[<p>gcc hat wahrscheinlich recht.<br />
Einfachster Workaround: modifiziere end_visitor</p>
<pre><code class="language-cpp">template &lt;typename U=Inner&gt;
U end_visitor()
{
    return U(move(m_args));
}
</code></pre>
<p>Abstrakte Klassen dürfen nicht als Rückgabetypen von Funktionen auftreten.<br />
Compiler verhalten sich allerdings unterscheidlich, wenn die Tatsache, dass eine Klasse abstrakt ist, bei der Funktionsdeklaration nicht bekannt ist.</p>
<pre><code class="language-cpp">struct X;
X foo();
struct X { void bar() = 0; }; // Deklaration von foo wird nachträglich ill-formed
</code></pre>
<p>gcc ist hier traditionell recht streng.</p>
<p>Bei der Instantiierung einer Templateklasse werden auch die <em>Deklarationen</em> aller Member instantiiert.<br />
CompositeVisitor&lt;...,EmptyVisitor&lt;...&gt;:Inner,...&gt;&gt;::end_visitor wir nie instantiiert, aber die Deklaration als solche ist ill-formed sobald Inner instantiiert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2435866</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2435866</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 03 Jan 2015 15:17:40 GMT</pubDate></item><item><title><![CDATA[Reply to Kompilierfehler im Bsp. aus dem ACCU Artikel &amp;quot;Defining Visitors Inline in Modern C++&amp;quot; on Sat, 03 Jan 2015 15:16:33 GMT]]></title><description><![CDATA[<p>Vielen Dank! Das funktioniert.</p>
<p>Edit:<br />
Danke auch für die Erklärung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2435867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2435867</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sat, 03 Jan 2015 15:16:33 GMT</pubDate></item></channel></rss>