<?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[boost::shared_ptr in multimap einbauen - doppelter key will nicht.]]></title><description><![CDATA[<p>hallo,</p>
<p>aaalso ich habe eine std::multimap byId vom Typ</p>
<p>typedef multimap&lt;Token::ptr, Thesis::ptr&gt; idmap;</p>
<p>die ::ptr sind shared_ptr auf die entsprechende Klasse.</p>
<p>diese bekommt daten aus einer Textdatei eingepflegt. Der Textdateiparser funktioniert so weit ganz gut, ich erhalte eine Instanz von Thesis, welche meine Daten beinhaltet, unter Anderem ein subject mit dem Typ Token::ptr.</p>
<p>Fülle ich jetzt Daten mittels</p>
<p>this-&gt;byId.insert(pair&lt;Token::ptr, Thesis::ptr&gt; (t-&gt;subject, t));</p>
<p>in meine multimap, funktioniert dieses nur, solange die key's nicht den gleichen Wert beinhalten- das ist allerdings ungünstig, weil macht ja die multimap erst aus..</p>
<p>Wo hab ich jetzt das Problem?<br />
die generierten Daten sind jedes Mal neue Instanzen- auch, wenn die Werte gleich sind. Könnte er sich daran stoßen?</p>
<p>Edit: Der Laufzeitfehler gestaltet sich wie folgt:<br />
/usr/include/boost/shared_ptr.hpp:315: T* boost::shared_ptr&lt;T&gt;::operator-&gt;() const [with T = semnet::Word]: Assertion `px != 0' failed.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/263028/boost-shared_ptr-in-multimap-einbauen-doppelter-key-will-nicht</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 01:28:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/263028.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 15 Mar 2010 08:11:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost::shared_ptr in multimap einbauen - doppelter key will nicht. on Mon, 15 Mar 2010 08:12:39 GMT]]></title><description><![CDATA[<p>hallo,</p>
<p>aaalso ich habe eine std::multimap byId vom Typ</p>
<p>typedef multimap&lt;Token::ptr, Thesis::ptr&gt; idmap;</p>
<p>die ::ptr sind shared_ptr auf die entsprechende Klasse.</p>
<p>diese bekommt daten aus einer Textdatei eingepflegt. Der Textdateiparser funktioniert so weit ganz gut, ich erhalte eine Instanz von Thesis, welche meine Daten beinhaltet, unter Anderem ein subject mit dem Typ Token::ptr.</p>
<p>Fülle ich jetzt Daten mittels</p>
<p>this-&gt;byId.insert(pair&lt;Token::ptr, Thesis::ptr&gt; (t-&gt;subject, t));</p>
<p>in meine multimap, funktioniert dieses nur, solange die key's nicht den gleichen Wert beinhalten- das ist allerdings ungünstig, weil macht ja die multimap erst aus..</p>
<p>Wo hab ich jetzt das Problem?<br />
die generierten Daten sind jedes Mal neue Instanzen- auch, wenn die Werte gleich sind. Könnte er sich daran stoßen?</p>
<p>Edit: Der Laufzeitfehler gestaltet sich wie folgt:<br />
/usr/include/boost/shared_ptr.hpp:315: T* boost::shared_ptr&lt;T&gt;::operator-&gt;() const [with T = semnet::Word]: Assertion `px != 0' failed.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869103</guid><dc:creator><![CDATA[DocJunioR]]></dc:creator><pubDate>Mon, 15 Mar 2010 08:12:39 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr in multimap einbauen - doppelter key will nicht. on Mon, 15 Mar 2010 08:34:11 GMT]]></title><description><![CDATA[<p>Kannst du die genaue Stelle ausfindig machen, an dem der Fehler auftritt?</p>
<p>Das klingt für mich in meinem jugendlichen Leichtsinn danach, dass du zuerst einen shared_ptr (implizit) default-konstruierst und ihn später (implizit) dereferenzierst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869111</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Mon, 15 Mar 2010 08:34:11 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr in multimap einbauen - doppelter key will nicht. on Mon, 15 Mar 2010 10:18:48 GMT]]></title><description><![CDATA[<p>joa, das scheints gewesen zu sein. hab in meiner klasse zwei alternierende elemente, die jetzt jeweils einen defaultwert kriegen- schon klappts..</p>
<p>was allerdings jetzt noch immer nicht geht, ist das Auffinden von Elementen mittels equal_range:</p>
<pre><code class="language-cpp">Database::tokeniterator tit = database-&gt;findbyToken(Token::ptr(new Token(&quot;#1&quot;)));
        Database::idmap::iterator it2;
        for (it2 = tit.first; it2 != tit.second; ++it2) {
            cout &lt;&lt; (*it2).second-&gt;toString() &lt;&lt; endl;
        }
</code></pre>
<p>dies gibt bei mir nichts aus und das, obwohl eindeutig ein Token namens #1 existiert.</p>
<p>Token sieht so aus:</p>
<pre><code class="language-cpp">class Token : public DBElement {
        private:
            uint32_t id;
            static uint32_t maxid;

            void setId (uint32_t id);

            virtual void fromString(string s);

        public:
            typedef boost::shared_ptr&lt;Token&gt; ptr;

            virtual string toString();
            virtual const uint32_t getId();

            Token();
            Token(uint32_t pid);
            Token(string pToken);
            Token(ptr p);

            bool operator== (Token &amp; pToken);
            bool operator== (const uint32_t pId);
            bool operator&lt;  (Token &amp; pToken);
            bool operator&lt;  (const uint32_t pId);

            static bool isToken (string pString);
    };
</code></pre>
<p>mit folgender Implementierung:</p>
<pre><code class="language-cpp">/* ****************************************
     *  token data
     */
    uint32_t Token::maxid = 0;

    /*
     * set id
     */
    void Token::setId(uint32_t id) {
        /*
         * set maximum id
         */
        if (maxid &lt; id) {
            maxid = id;
        }
        this-&gt;id = id;
    }

    /*
     * read Id from String
     */
    void Token::fromString(string s) {
        if (s[0] == '#') {
            setId(atoi(s.substr(1).c_str()));
        }
    }

    /*
     * put Id to string
     */
    string Token::toString() {
        string s;
        stringstream ss;
        ss &lt;&lt; &quot;#&quot; &lt;&lt; id;
        ss &gt;&gt; s;
        return s;
    }

    /*
     * create new token
     */
    Token::Token() {
        this-&gt;setId(maxid + 1);
    }

    /*
     * create new token by id
     */
    Token::Token(uint32_t pId) {
        setId(pId);
    }

    /*
     * create new token by string
     */
    Token::Token(string pToken) {
        fromString(pToken);
    }

    Token::Token(Token::ptr p) {
        fromString(p-&gt;toString());
    }
    /*
     * get token id
     */
    const uint32_t Token::getId() {
        return id;
    }

    bool Token::operator==(Token &amp; pToken) {
        return operator==(pToken.getId());
    }
    bool Token::operator==(const uint32_t pId) {
        return this-&gt;id == pId;
    }
    bool Token::operator&lt;(Token &amp; pToken) {
        return operator&lt;(pToken.getId());
    }
    bool Token::operator&lt;(const uint32_t pId) {
        return this-&gt;id &lt; pId;
    }
    bool Token::isToken(string pString) {
        return (pString[0] == '#');
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1869154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869154</guid><dc:creator><![CDATA[DocJunioR]]></dc:creator><pubDate>Mon, 15 Mar 2010 10:18:48 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr in multimap einbauen - doppelter key will nicht. on Mon, 15 Mar 2010 11:01:48 GMT]]></title><description><![CDATA[<p>Wird auch der richtige Vergleich durchgeführt? Nicht dass du die beiden Pointer vergleichst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869172</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Mon, 15 Mar 2010 11:01:48 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr in multimap einbauen - doppelter key will nicht. on Mon, 15 Mar 2010 11:12:17 GMT]]></title><description><![CDATA[<p>Das passiert aber:</p>
<pre><code class="language-cpp">typedef multimap&lt;Token::ptr, Thesis::ptr&gt; idmap;
</code></pre>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10960">@Doc</a> Du musst da ein eigenes compare verwenden das die dereferenzierten keys vergleicht.</p>
<p>Edit: Oder 'globale' compare operatoren für die ptr</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869176</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Mon, 15 Mar 2010 11:12:17 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr in multimap einbauen - doppelter key will nicht. on Mon, 15 Mar 2010 12:13:04 GMT]]></title><description><![CDATA[<p>so weit ich weiß, macht der shared_ptr&lt;&gt;::operator== ein a.get() == b.get()<br />
hmm.. ja, da werden die pointer verglichen..</p>
<p>aalso neue operatoren bauen..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869217</guid><dc:creator><![CDATA[DocJunioR]]></dc:creator><pubDate>Mon, 15 Mar 2010 12:13:04 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr in multimap einbauen - doppelter key will nicht. on Mon, 15 Mar 2010 17:41:11 GMT]]></title><description><![CDATA[<p>iirgendwie greift er das nicht an..<br />
ich dachte mir eigentlich, dass ein</p>
<pre><code class="language-cpp">bool operator== ( Token &amp; a,  Token &amp; b) {
        return a.toString() == b.toString();
    }
</code></pre>
<p>ausreicht, reagiert aber kein Stück..</p>
<p>hm.. öh... hilfe?^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869434</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869434</guid><dc:creator><![CDATA[DocJunioR]]></dc:creator><pubDate>Mon, 15 Mar 2010 17:41:11 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr in multimap einbauen - doppelter key will nicht. on Mon, 15 Mar 2010 17:55:46 GMT]]></title><description><![CDATA[<p>Also erst einmal sollten vergleichsoperatoren const sein und const references verwenden.</p>
<p>Zweitens benutzt eine map by default den operator &lt; (siehe 3. parameter)</p>
<pre><code class="language-cpp">std::map&lt; 
    KeyType, 
    ValueType, 
    Compare = std::less&lt;KeyType&gt;, 
    Alloc&lt;std::pair&lt; KeyType const, ValueType&gt; 
&gt;
</code></pre>
<p>Edit: Drittens musst du den Operator für Token::ptr erstellen da das ja versucht wird zu vergleichen .get() bei shared_ptr liefert doch den pointer und keine referenz auf das objekt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869441</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Mon, 15 Mar 2010 17:55:46 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr in multimap einbauen - doppelter key will nicht. on Mon, 15 Mar 2010 19:16:07 GMT]]></title><description><![CDATA[<p>so na denn aber schönen schrank <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="🙂"
    /><br />
wer lesen kann ist klar im Vorteil ^^ mit ner Operatorklasse klappts dann auch</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1869490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1869490</guid><dc:creator><![CDATA[DocJunioR]]></dc:creator><pubDate>Mon, 15 Mar 2010 19:16:07 GMT</pubDate></item></channel></rss>