<?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[Mehrere Probleme mit boost::intrusive::slist]]></title><description><![CDATA[<p>Moin.<br />
Also ich versuche diese Klasse zu verwenden. Allerdings verzeifel ich hier bald.</p>
<p>Die Klasse &quot;Sprite&quot; soll in einer single linked list verwendet werden.<br />
Das mache ich wie folgt:</p>
<pre><code class="language-cpp">typedef public boost::intrusive::link_mode&lt;boost::intrusive::auto_unlink&gt; NLLinkMode;
typedef public boost::intrusive::slist_base_hook&lt; NLLinkMode &gt; NLAutoUnlinkHook;

class NLEXPORT NLSprite : public NLBoundingBox, public NLAutoUnlinkHook
{
public:
   void unlink()     {  NLAutoUnlinkHook::unlink();  }
   bool is_linked()  {  return NLAutoUnlinkHook::is_linked();  }
};
</code></pre>
<p>Hier ist schon das erste Problem. Sobald das NLEXPORT, welches beim Build als __declspec(dllexport) definiert ist davor steht, geht nur noch der auto_unlink. Alles andere generiert boost::static asserts.<br />
Benutze ich als beispiel safe_link, gibt es hier einen Compilerfehler:</p>
<pre><code class="language-cpp">void unlink()
   {
      BOOST_STATIC_ASSERT(( (int)boost_intrusive_tags::link_mode == (int)auto_unlink ));
      node_algorithms::unlink(static_cast&lt;node*&gt;(this));
      node_algorithms::init(static_cast&lt;node*&gt;(this));
   }
</code></pre>
<p>Aber okay, mit dem auto_unlink kann man sich ja abfinden. Es funkioniert so auch in meinem Programm, wenn ich das ganze mit</p>
<pre><code class="language-cpp">class ShootingManager : public boost::noncopyable
{
	typedef boost::intrusive::slist&lt;IWeapon, boost::intrusive::constant_time_size&lt;false&gt; &gt; TShotList;

   TShotList m_shots;
};
</code></pre>
<p>in eine Liste stecke. Keine Memory Leaks, alles in Ordnung. Fein.</p>
<p>Jetzt kommt das Problem:<br />
In meiner Klasse SpriteBatcher brauche ich eine Map mit SpriteKlassen, sortiert nach ShaderId, damit ich nicht jeden Frame die ganzen Sprites erst sortieren und zusammensuchen muss:</p>
<pre><code class="language-cpp">class NLEXPORT SpriteBatcher
{
public:
	typedef boost::intrusive::slist&lt;NLSprite, boost::intrusive::constant_time_size&lt;false&gt; &gt; TSpriteListC;	
	typedef boost::ptr_map&lt;u32, TSpriteListC&gt; TList;

private:
  TList m_sprites;
};
</code></pre>
<p>Aber schon hagelt es wieder Fehler:</p>
<p>MSVC Compiler schrieb:</p>
<blockquote>
<p>1&gt;D:\Source\Packages\boost\boost/intrusive/slist.hpp(2088) : error C2248: 'boost::intrusive::slist_impl&lt;Config&gt;::slist_impl' : cannot access private member declared in class 'boost::intrusive::slist_impl&lt;Config&gt;'<br />
1&gt; with<br />
1&gt; [<br />
1&gt; Config=boost::intrusive::slistopt&lt;boost::intrusive::detail::base_hook_traits&lt;NightLight::NLSprite,boost::intrusive::slist_node_traits&lt;void *&gt;,auto_unlink,boost::intrusive::default_tag,2&gt;,unsigned int,false,false,false&gt;<br />
1&gt; ]<br />
1&gt; D:\Source\Packages\boost\boost/intrusive/slist.hpp(153) : see declaration of 'boost::intrusive::slist_impl&lt;Config&gt;::slist_impl'<br />
1&gt; with<br />
1&gt; [<br />
1&gt; Config=boost::intrusive::slistopt&lt;boost::intrusive::detail::base_hook_traits&lt;NightLight::NLSprite,boost::intrusive::slist_node_traits&lt;void *&gt;,auto_unlink,boost::intrusive::default_tag,2&gt;,unsigned int,false,false,false&gt;<br />
1&gt; ]<br />
1&gt; This diagnostic occurred in the compiler generated function 'boost::intrusive::slist&lt;T,O1&gt;::slist(const boost::intrusive::slist&lt;T,O1&gt; &amp;)'<br />
1&gt; with<br />
1&gt; [<br />
1&gt; T=NightLight::NLSprite,<br />
1&gt; O1=boost::intrusive::constant_time_size&lt;false&gt;<br />
1&gt; ]</p>
</blockquote>
<p>Kann mir wer diesen Fehler bitte erklären? Ich hab von diesem ganzen Meta Template Zeug einfach zu wenig Ahnung und bin echt am verzweifeln. Danke euch vielmals. Ansonsten werde ich wohl selbst eine single linked list schreiben müssen.<br />
Man muss allerdings dazu sagen dass mir hier manchmal sogar der MSVC abstürzt wenn ich nicht haufenweise typedefs verwende mit der Meldung ich möge meinen Code vereinfachen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/282294/mehrere-probleme-mit-boost-intrusive-slist</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 07:17:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/282294.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 17 Feb 2011 15:02:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mehrere Probleme mit boost::intrusive::slist on Thu, 17 Feb 2011 15:03:57 GMT]]></title><description><![CDATA[<p>Moin.<br />
Also ich versuche diese Klasse zu verwenden. Allerdings verzeifel ich hier bald.</p>
<p>Die Klasse &quot;Sprite&quot; soll in einer single linked list verwendet werden.<br />
Das mache ich wie folgt:</p>
<pre><code class="language-cpp">typedef public boost::intrusive::link_mode&lt;boost::intrusive::auto_unlink&gt; NLLinkMode;
typedef public boost::intrusive::slist_base_hook&lt; NLLinkMode &gt; NLAutoUnlinkHook;

class NLEXPORT NLSprite : public NLBoundingBox, public NLAutoUnlinkHook
{
public:
   void unlink()     {  NLAutoUnlinkHook::unlink();  }
   bool is_linked()  {  return NLAutoUnlinkHook::is_linked();  }
};
</code></pre>
<p>Hier ist schon das erste Problem. Sobald das NLEXPORT, welches beim Build als __declspec(dllexport) definiert ist davor steht, geht nur noch der auto_unlink. Alles andere generiert boost::static asserts.<br />
Benutze ich als beispiel safe_link, gibt es hier einen Compilerfehler:</p>
<pre><code class="language-cpp">void unlink()
   {
      BOOST_STATIC_ASSERT(( (int)boost_intrusive_tags::link_mode == (int)auto_unlink ));
      node_algorithms::unlink(static_cast&lt;node*&gt;(this));
      node_algorithms::init(static_cast&lt;node*&gt;(this));
   }
</code></pre>
<p>Aber okay, mit dem auto_unlink kann man sich ja abfinden. Es funkioniert so auch in meinem Programm, wenn ich das ganze mit</p>
<pre><code class="language-cpp">class ShootingManager : public boost::noncopyable
{
	typedef boost::intrusive::slist&lt;IWeapon, boost::intrusive::constant_time_size&lt;false&gt; &gt; TShotList;

   TShotList m_shots;
};
</code></pre>
<p>in eine Liste stecke. Keine Memory Leaks, alles in Ordnung. Fein.</p>
<p>Jetzt kommt das Problem:<br />
In meiner Klasse SpriteBatcher brauche ich eine Map mit SpriteKlassen, sortiert nach ShaderId, damit ich nicht jeden Frame die ganzen Sprites erst sortieren und zusammensuchen muss:</p>
<pre><code class="language-cpp">class NLEXPORT SpriteBatcher
{
public:
	typedef boost::intrusive::slist&lt;NLSprite, boost::intrusive::constant_time_size&lt;false&gt; &gt; TSpriteListC;	
	typedef boost::ptr_map&lt;u32, TSpriteListC&gt; TList;

private:
  TList m_sprites;
};
</code></pre>
<p>Aber schon hagelt es wieder Fehler:</p>
<p>MSVC Compiler schrieb:</p>
<blockquote>
<p>1&gt;D:\Source\Packages\boost\boost/intrusive/slist.hpp(2088) : error C2248: 'boost::intrusive::slist_impl&lt;Config&gt;::slist_impl' : cannot access private member declared in class 'boost::intrusive::slist_impl&lt;Config&gt;'<br />
1&gt; with<br />
1&gt; [<br />
1&gt; Config=boost::intrusive::slistopt&lt;boost::intrusive::detail::base_hook_traits&lt;NightLight::NLSprite,boost::intrusive::slist_node_traits&lt;void *&gt;,auto_unlink,boost::intrusive::default_tag,2&gt;,unsigned int,false,false,false&gt;<br />
1&gt; ]<br />
1&gt; D:\Source\Packages\boost\boost/intrusive/slist.hpp(153) : see declaration of 'boost::intrusive::slist_impl&lt;Config&gt;::slist_impl'<br />
1&gt; with<br />
1&gt; [<br />
1&gt; Config=boost::intrusive::slistopt&lt;boost::intrusive::detail::base_hook_traits&lt;NightLight::NLSprite,boost::intrusive::slist_node_traits&lt;void *&gt;,auto_unlink,boost::intrusive::default_tag,2&gt;,unsigned int,false,false,false&gt;<br />
1&gt; ]<br />
1&gt; This diagnostic occurred in the compiler generated function 'boost::intrusive::slist&lt;T,O1&gt;::slist(const boost::intrusive::slist&lt;T,O1&gt; &amp;)'<br />
1&gt; with<br />
1&gt; [<br />
1&gt; T=NightLight::NLSprite,<br />
1&gt; O1=boost::intrusive::constant_time_size&lt;false&gt;<br />
1&gt; ]</p>
</blockquote>
<p>Kann mir wer diesen Fehler bitte erklären? Ich hab von diesem ganzen Meta Template Zeug einfach zu wenig Ahnung und bin echt am verzweifeln. Danke euch vielmals. Ansonsten werde ich wohl selbst eine single linked list schreiben müssen.<br />
Man muss allerdings dazu sagen dass mir hier manchmal sogar der MSVC abstürzt wenn ich nicht haufenweise typedefs verwende mit der Meldung ich möge meinen Code vereinfachen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2022318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2022318</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 17 Feb 2011 15:03:57 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Probleme mit boost::intrusive::slist on Thu, 17 Feb 2011 20:53:44 GMT]]></title><description><![CDATA[<p>Hallo Scorcher24,</p>
<p>ich kann Deine Fehler nicht nachvollziehen.</p>
<p>Scorcher24 schrieb:</p>
<blockquote>
<p>Man muss allerdings dazu sagen dass mir hier manchmal sogar der MSVC abstürzt wenn ich nicht haufenweise typedefs verwende mit der Meldung ich möge meinen Code vereinfachen.</p>
</blockquote>
<p>.. Du benutzt nicht zufällig das MS-VS6?</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2022502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2022502</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 17 Feb 2011 20:53:44 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Probleme mit boost::intrusive::slist on Thu, 17 Feb 2011 21:33:11 GMT]]></title><description><![CDATA[<p>Nein, Visual C++ Professional 2008 inkl. SP1 und aller Patches die verfügbar sind.<br />
Ich habe boost von <a href="http://www.boostpro.com/download/" rel="nofollow">http://www.boostpro.com/download/</a>. Version 1.44, verwende auch nur shared libs, aber intrusive ist header only.<br />
Ich kann mir diese Compilerfehler auch nicht erklären.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2022513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2022513</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 17 Feb 2011 21:33:11 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Probleme mit boost::intrusive::slist on Thu, 17 Feb 2011 21:56:16 GMT]]></title><description><![CDATA[<p>Boost.Intrusive Container sind nicht kopierbar.<br />
Warum steht hier: <a href="http://www.boost.org/doc/libs/1_45_0/doc/html/intrusive/clone_from.html" rel="nofollow">http://www.boost.org/doc/libs/1_45_0/doc/html/intrusive/clone_from.html</a></p>
<p>D.h. wenn du Klassen schreibst die Boost.Intrusive Container als Member enthalten, dann sind diese ebenfalls nicht kopierbar.<br />
Wieso es MSVC genau zerreisst weiss ich auch nicht genau, aber wenn du genau guckst wirst du feststellen dass er beim Compilieren des Copy-Ctor von boost::intrusive::slist auf die Schnauze fällt.</p>
<p>Warum geht es ohne __declspec(dllexport)? Weil der Compiler implizit definierte Funktionen (default-ctor, copy-ctor, assignment und dtor) erst dort generiert, wo sie das erste mal verwendet werden. Wenn du nie versuchst deine Klasse zu kopieren versucht er auch nie den copy-ctor zu generieren, und fliegt nie auf die Schnauze. __declspec(dllexport) ändert das Spiel allerdings, da du dem Compiler damit ja sagst er muss alle Methoden exportieren. Und MSVC exportiert dann auch implizit definierte Funktionen, d.h. er versucht sie zu definieren, und dabei würfelt es ihn.</p>
<p>Lösung: mach deine Klassen die Boost.Intrusive Container enthalten noncopyable.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2022518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2022518</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 17 Feb 2011 21:56:16 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Probleme mit boost::intrusive::slist on Thu, 17 Feb 2011 22:20:38 GMT]]></title><description><![CDATA[<p>Okay danke für die Erklärung. Dass sie nicht kopierbar sind, das weiss ich.<br />
Aber deswegen dann auch die Fehlermeldung beim deklarieren der Map.</p>
<p>Hmm, nur welche Lösung nehme ich dann zum vor-sortieren meiner Sprites?<br />
Lässt sich für ptr_map kein allocator über die template parameter deklarieren der eben nicht kopiert sondern nur den Pointer übernimmt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2022525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2022525</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 17 Feb 2011 22:20:38 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Probleme mit boost::intrusive::slist on Thu, 17 Feb 2011 23:15:12 GMT]]></title><description><![CDATA[<p>Wieso willst du mehrere Listen in eine Map Stecken?<br />
Steck doch lieber gleich die Sprites in ein Intrusive Multiset.</p>
<p>Oder, wenn du unbedingt willst, dann mach eine eigene Klasse/Struct, die als Member nur die Shader-ID und die Intrusive List hat. Die Objekte dieser Klasse steckst du dann in ein Intrusive Set.</p>
<p>OK, wenn ich so drüber nachdenke könnte das evtl. sogar Performence-Vorteile bringen, je nachdem wie das Intrusive Set implementiert ist. Müsste man ausprobieren was schneller ist.</p>
<p>ps.:</p>
<blockquote>
<p>Aber deswegen dann auch die Fehlermeldung beim deklarieren der Map.</p>
</blockquote>
<p>Die Map hatte ich erst übersehen. Dann ist mir auch klar warum MSVC die Fehlermeldung bringt. Ich dachte erst MSVC hätte selbst versucht nen Copy-Ctor für deine Klasse zu erstellen, trotz unkopierbarem Member. Und das wäre etwas seltsam gewesen <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/2022534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2022534</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 17 Feb 2011 23:15:12 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrere Probleme mit boost::intrusive::slist on Fri, 18 Feb 2011 05:44:17 GMT]]></title><description><![CDATA[<p>hustbaer, danke dir vielmals für deine Hilfe.<br />
Habe jetzt das ganze überarbeitet.</p>
<p>Falls es dich interessiert (wenn nicht hör auf zu lesen :p):<br />
Ich habe einfach eine neue Klasse erstellt, NLSpriteList.<br />
Der managed nicht nur eine Liste von Sprites, sondern auch gleichzeitig das VBO dazu. Jeder Spritelist wird ein Shader zugewiesen.</p>
<p>Die Überklasse dazu wird dann SpriteListBatcher heissen und diesem wird ein SpriteSheet zugewiesen. Für jedes SpriteSheet brauchts dann nen extra Batcher und für jeden Shader nen extra VBO.</p>
<p>Ich denke so ist das am günstigsten und stressfrei gelöst.<br />
Jedenfalls bin ich grade von ~400 GL Calls runter auf ~100 GL Calls pro Frame.</p>
<p>Da geht aber noch was, ich hab noch gar nicht alles durch um das umzustellen :D.<br />
Die Frames sind zumindest um einiges stabiler geworden ohne VSYNC.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2022565</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2022565</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Fri, 18 Feb 2011 05:44:17 GMT</pubDate></item></channel></rss>