<?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[GCC 4.4.7 vs. GCC 4.7]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>für das Zufallszahlenthema habe ich ja über die devtools mir einen GCC 4.7 auf meine Centos 6 Maschine geholt. Sehr fein, nur akzeptiert er nen Aufruf nicht, den der GCC 4.4 genommen hat.</p>
<p>Ich habe in einer Map-Klasse folgende Methode definiert:</p>
<pre><code>template&lt;typename T&gt;
void set(const char * key, const T &amp; t);
</code></pre>
<p>Und will sie so nutzen:</p>
<pre><code>storage.set&lt;PeerIDList&gt;(&quot;peerIDList&quot;, peerList);
</code></pre>
<p>Storage ist nun genau von diesen Map-Typ. Wie gesagt, unter GCC 4.4 ging dies, der GCC 4.7 sagt:</p>
<pre><code>error: expected primary-expression before ‘&gt;’ token
</code></pre>
<p>Jemand nen Tip??? <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/325146/gcc-4-4-7-vs-gcc-4-7</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Jul 2026 14:44:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/325146.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 16 Apr 2014 15:28:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to GCC 4.4.7 vs. GCC 4.7 on Wed, 16 Apr 2014 15:28:04 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>für das Zufallszahlenthema habe ich ja über die devtools mir einen GCC 4.7 auf meine Centos 6 Maschine geholt. Sehr fein, nur akzeptiert er nen Aufruf nicht, den der GCC 4.4 genommen hat.</p>
<p>Ich habe in einer Map-Klasse folgende Methode definiert:</p>
<pre><code>template&lt;typename T&gt;
void set(const char * key, const T &amp; t);
</code></pre>
<p>Und will sie so nutzen:</p>
<pre><code>storage.set&lt;PeerIDList&gt;(&quot;peerIDList&quot;, peerList);
</code></pre>
<p>Storage ist nun genau von diesen Map-Typ. Wie gesagt, unter GCC 4.4 ging dies, der GCC 4.7 sagt:</p>
<pre><code>error: expected primary-expression before ‘&gt;’ token
</code></pre>
<p>Jemand nen Tip??? <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/2394895</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394895</guid><dc:creator><![CDATA[sven_]]></dc:creator><pubDate>Wed, 16 Apr 2014 15:28:04 GMT</pubDate></item><item><title><![CDATA[Reply to GCC 4.4.7 vs. GCC 4.7 on Wed, 16 Apr 2014 16:09:59 GMT]]></title><description><![CDATA[<p>Wie ist <code>PeerIDList</code> definiert? Falls es ein Typ ist, ist das wohl ein Bug - sehr überraschend, dass der GCC da so einen Hauer hat. Kannst du irgendwie ein reproduzierbares kurzes Beispiel machen, wo der selbe Fehler auftritt?</p>
<blockquote>
<pre><code>storage.set&lt;PeerIDList&gt;(&quot;peerIDList&quot;, peerList);
</code></pre>
</blockquote>
<p>Gibt es einen Grund, warum du die Template-Argumente selbst angibst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394898</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 16 Apr 2014 16:09:59 GMT</pubDate></item><item><title><![CDATA[Reply to GCC 4.4.7 vs. GCC 4.7 on Wed, 16 Apr 2014 16:33:29 GMT]]></title><description><![CDATA[<p>Ja gibt es. <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>Storage ist eine HeterogeneousMap:</p>
<pre><code>std::map&lt;std::string, boost::any&gt; storage;
</code></pre>
<p>Dadurch ist set:</p>
<pre><code>template&lt;typename T&gt;
        void
        HeterogeneousMap::set(const char * key, const T &amp; t) {

            if (!storage[key].empty()) {
                if (storage[key].type() != typeid (T)) {
                    std::stringstream buf;
                    buf &lt;&lt; &quot;bad type, expect &quot; &lt;&lt; storage[key].type().name() &lt;&lt; &quot; for key: &quot; &lt;&lt; key;
                    throw ParameterException(buf.str().c_str());

                }
                storage[key] = t;
            }
            else {
                storage[key] = t;
            }
        }
</code></pre>
<p>Ich speichere unter string Schlüssel zu verschiedene Objekte. Damit da so ne Art Typsicherheit für das intern zugreifen auf die Map.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394901</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394901</guid><dc:creator><![CDATA[sven_]]></dc:creator><pubDate>Wed, 16 Apr 2014 16:33:29 GMT</pubDate></item><item><title><![CDATA[Reply to GCC 4.4.7 vs. GCC 4.7 on Wed, 16 Apr 2014 17:09:31 GMT]]></title><description><![CDATA[<p>Bitte compilierbares (bzw. beim GCC 4.7 bis auf den Fehler compilierbares) Minimalbeispiel erstellen und posten.<br />
<a href="http://www.c-plusplus.net/forum/304133" rel="nofollow">http://www.c-plusplus.net/forum/304133</a></p>
<p>Die wichtige Frage, was PeerIDList ist, hast du auch noch nicht beantwortet. Die Antwort sollte sich aber aus dem Minimalbeispiel von selbst ergeben, also sieh lieber zu, dass du das Minimalbeispiel erstellst, anstatt diese Frage zu beantworten. Falls sich aus dem Minimalbeispiel nicht ergeben sollte, was PeerIDList ist, dann hast du den Fehler schon gefunden, denn dann weiss es der Compiler auch nicht<sup>*</sup>. Das ist einer der Vorteile beim Erstellen solcher Beispiele, dass man dabei meistens schon alleine den Fehler findet <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><sup>*</sup>: Warum der GCC 4.4 das dann trotzdem uebersetzt ist eine andere Frage. Ist vielleicht irgendein Include veraendert worden? Verlaesst du dich vielleicht irgendwo auf indirekte Includes der Standardheader? Waehrend die Header der Standardbibliothek des GCC 4.4 noch recht grosszuegig andere Header eingebunden haben, hat man in den letzten Jahren recht viele Anstrengungen unternommen, diese Indirektionen moeglichst raus zu machen (ausser dort, wo sie vom Sprachstandard vorgeschrieben sind). Dadurch ist eventuell irgendein Typ nicht bekannt. Aehnliches gilt eventuell auch, falls du unterschiedliche Versionen von Boost benutzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394905</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394905</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 16 Apr 2014 17:09:31 GMT</pubDate></item><item><title><![CDATA[Reply to GCC 4.4.7 vs. GCC 4.7 on Wed, 16 Apr 2014 18:00:46 GMT]]></title><description><![CDATA[<p>sven_ schrieb:</p>
<blockquote>
<p>Dadurch ist set:</p>
<pre><code>template&lt;typename T&gt;
        void
        HeterogeneousMap::set(const char * key, const T &amp; t)
</code></pre>
</blockquote>
<p>Was du innerhalb von <code>set</code> tust, ist irrelevant. Wichtig ist nur die Signatur.</p>
<p>Da dort ein <code>const T&amp;</code> vorkommt, wobei <code>T</code> ein Templateparameter ist, kann das Templateargument beim Aufruf hergeleitet werden. Es reicht also,</p>
<pre><code>storage.set(&quot;peerIDList&quot;, peerList);
</code></pre>
<p>zu schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394910</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 16 Apr 2014 18:00:46 GMT</pubDate></item><item><title><![CDATA[Reply to GCC 4.4.7 vs. GCC 4.7 on Wed, 16 Apr 2014 18:15:57 GMT]]></title><description><![CDATA[<p>Ich vermute mal ein fehlendes template-Schlüsselwort (unterstellt, dass storage ein abhängiger Bezeichner ist). Andererseits hat gcc 4.4.7 das auch schon an solchen Stellen verlangt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394913</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 16 Apr 2014 18:15:57 GMT</pubDate></item><item><title><![CDATA[Reply to GCC 4.4.7 vs. GCC 4.7 on Wed, 16 Apr 2014 18:26:13 GMT]]></title><description><![CDATA[<p>ich tippe auf Fehler beim includen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394916</guid><dc:creator><![CDATA[großbuchstaben]]></dc:creator><pubDate>Wed, 16 Apr 2014 18:26:13 GMT</pubDate></item><item><title><![CDATA[Reply to GCC 4.4.7 vs. GCC 4.7 on Wed, 16 Apr 2014 20:16:21 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Ich vermute mal ein fehlendes template-Schlüsselwort (unterstellt, dass storage ein abhängiger Bezeichner ist).</p>
</blockquote>
<p>Ja... aber <code>storage</code> ist, wie er direkt in seinem zweiten Post zeigt, nicht abhängig von irgendwelchen Template-Argumenten deklariert. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394938</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 16 Apr 2014 20:16:21 GMT</pubDate></item><item><title><![CDATA[Reply to GCC 4.4.7 vs. GCC 4.7 on Wed, 30 Apr 2014 09:32:41 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>sorry, hab mich ne Weile nicht gemeldet, da ich beruflich unterwegs war. Hier mal ein Minibeispiel, welches den Fehler erzeugt:</p>
<pre><code>#include &lt;cstdlib&gt;

#include &lt;string&gt;
#include &lt;iostream&gt;
#include &lt;map&gt;
#include &lt;vector&gt;
#include &quot;boost/any.hpp&quot;

typedef std::vector&lt;int&gt; PeerIDList;

class HeterogeneousMap {
public:

    HeterogeneousMap() {
    }

    virtual
    ~HeterogeneousMap() {
    }

    template&lt;typename T&gt;
    void
    set(const std::string &amp; key, const T &amp; t) {

        if (!storage[key].empty()) {
            if (storage[key].type() == typeid (T)) {
                std::cerr &lt;&lt; &quot;fehler\n&quot;;
                throw 0;

            }
            storage[key] = t;
        }
        else {
            storage[key] = t;
        }
    }

    template&lt;typename T&gt;
    T
    get(std::string key) {
        if (storage[key].empty()) {
            return T();
        }
        else {

            if (storage[key].type() == typeid (T)) {
                return boost::any_cast&lt;T&gt;(storage[key]);
            }
            else {

                std::cerr &lt;&lt; &quot;fehler\n&quot;;
                throw 0;
            }
        }
    }

private:
    std::map&lt;std::string, boost::any&gt; storage;

};

class BaseTimer {
protected:
    HeterogeneousMap storage;

};

template &lt;typename T&gt;
class ReferenceTimer : public BaseTimer {
};

template &lt;typename T&gt;
class ReferenceMonitorTimer : public ReferenceTimer&lt;T&gt; {
public:

    virtual void
    setPeerIDList(PeerIDList peerList) {
        BaseTimer::storage.set(&quot;peerIDList&quot;, peerList);
    }

    virtual PeerIDList
    getPeerIDList() {
        return BaseTimer::storage.get&lt;PeerIDList&gt;(std::string(&quot;peerIDList&quot;));

    }
};

/*
 *
 */
int
main(int argc, char** argv) {

    ReferenceMonitorTimer&lt;int&gt; timer;

    PeerIDList list1;
    timer.setPeerIDList(list1);
    PeerIDList list2 = timer.getPeerIDList();

    return 0;
}
</code></pre>
<p>Als Fehler erhalte ich:</p>
<pre><code>g++ -std=c++0x   -c -g -s -MMD -MP -MF &quot;build/Debug/GNU_1-Linux-x86/main.o.d&quot; -o build/Debug/GNU_1-Linux-x86/main.o main.cc
main.cc: In member function ‘virtual PeerIDList ReferenceMonitorTimer&lt;T&gt;::getPeerIDList()’:
main.cc:91:55: error: expected primary-expression before ‘&gt;’ token
gmake[2]: *** [build/Debug/GNU_1-Linux-x86/main.o] Error 1
</code></pre>
<p>Ich nutze um auf Centos6 eine Gcc 4.7 Umgebung zu haben die RedHat DevTools 1.1. Lasse ich im Aufruf &lt;PeerIDList&gt; weg, bekommt er das Template nicht mehr aufgelöst. Es sieht für mich aus, als ob er PeerIDList im Kontext nicht kennt, aber wieso????</p>
<p>Besten Danke für Eure Unterstützung im Vorraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396841</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396841</guid><dc:creator><![CDATA[sven_]]></dc:creator><pubDate>Wed, 30 Apr 2014 09:32:41 GMT</pubDate></item><item><title><![CDATA[Reply to GCC 4.4.7 vs. GCC 4.7 on Wed, 30 Apr 2014 10:05:16 GMT]]></title><description><![CDATA[<blockquote>
<pre><code>template &lt;typename T&gt;
class ReferenceMonitorTimer : public ReferenceTimer&lt;T&gt; {
public:

    virtual void
    setPeerIDList(PeerIDList peerList) {
        BaseTimer::storage.set(&quot;peerIDList&quot;, peerList);
    }

    virtual PeerIDList
    getPeerIDList() {
        return BaseTimer::storage.get&lt;PeerIDList&gt;(std::string(&quot;peerIDList&quot;));

    }
};
</code></pre>
</blockquote>
<p>Das ist mal tricky. <code>BaseTimer</code> hängt nicht von T ab. Aber die Basis von <code>ReferenceMonitorTimer&lt;T&gt;</code> ist <code>ReferenceTimer&lt;T&gt;</code> , was von <code>BaseTimer</code> erbt. Dem Compiler ist jedenfalls in der ersten Lookup-Phase nicht bekannt, dass <code>BaseTimer</code> wirklich eine Basisklasse von <code>ReferenceMonitorTimer&lt;T&gt;</code> ist.</p>
<p>Probier mal das hier:</p>
<pre><code class="language-cpp">return this-&gt;storage.template get&lt;PeerIDList&gt;(std::string(&quot;peerIDList&quot;));
</code></pre>
<p>Mit <code>this-&gt;</code> dürfte klar sein, dass <code>storage</code> ein Element einer Basis ist. Weil in der direkten Basis <code>T</code> auftaucht, wird das Lookup für <code>storage</code> verzögert. Weil der Compiler <code>storage</code> in der ersten Lookup-Phase nicht kennt, müssen wir ihm sagen, dass es sich bei <code>get</code> um ein Template handelt und dass damit das <code>&lt;</code> eine &quot;spitze Template-Klammer&quot; statt des kleiner-als-Operators ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396843</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396843</guid><dc:creator><![CDATA[kkaw]]></dc:creator><pubDate>Wed, 30 Apr 2014 10:05:16 GMT</pubDate></item><item><title><![CDATA[Reply to GCC 4.4.7 vs. GCC 4.7 on Wed, 30 Apr 2014 10:34:54 GMT]]></title><description><![CDATA[<p>Das ist ja mal geil. Es geht! Darf man noch fragen was storage.template ist? Kenne ich bisher nicht. Heißt es also, es ist problematisch, von templates zu erben und dann elemente der basis zu nutzen? kann man dies eventl. durch eine bessere basismethode fixen?</p>
<p>sven_</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396848</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396848</guid><dc:creator><![CDATA[sven_]]></dc:creator><pubDate>Wed, 30 Apr 2014 10:34:54 GMT</pubDate></item><item><title><![CDATA[Reply to GCC 4.4.7 vs. GCC 4.7 on Wed, 30 Apr 2014 10:53:23 GMT]]></title><description><![CDATA[<p>sven_ schrieb:</p>
<blockquote>
<p>Das ist ja mal geil. Es geht! Darf man noch fragen was storage.template ist?</p>
</blockquote>
<p>Hab ich ja versucht zu erklären. <code>storage</code> wurde nicht in <code>ReferenceMonitorTimer&lt;T&gt;</code> definiert. Und weil die Basis von <code>ReferenceMonitorTimer&lt;T&gt;</code> auch von <code>T</code> abhängt, ist <code>storage</code> in <code>this-&gt;storage</code> ein von einem Template-Parameter <em>abhängiger Name</em>. Wenn der Compiler das erste mal über das Template guckt, also bevor Du es instantiierst, dann weiß er nicht, was <code>storage</code> ist und dass es ein Member-Template namens <code>get</code> hat. <code>get</code> könnte auch ein Datenelement sein, was du dann mit dem Kleiner-Als-Operator mit etwas anderes zu vergleichen versuchst. Es gibt hier also eine Mehrdeutigkeit, die manuell aufgehoben werden muss. Dazu schreibt man dann das <code>template</code> -Schlüsselwort vor das <code>get</code> . Dann weiß der Compiler, dass <code>get</code> ein Template ist. So etwas ähnliches kennst Du wahrscheinlich schon. Manchmal muss man an einigen Stellen ein <code>typename</code> einbauen. Z.B. hier:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class foo
{
   vector&lt;T&gt; bar;

   void transmogrify()
   {
      typename vector&lt;T&gt;::iterator it = bar.begin();
      // ^^^^^
   }
};
</code></pre>
<p>Und so ähnlich ist das mit <code>template</code> für Member-Templates auch.</p>
<p>Stichwörter für Dich zum Recherchieren:<br />
Two-Phase-Lookup<br />
Dependent Names</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396850</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396850</guid><dc:creator><![CDATA[kkaw]]></dc:creator><pubDate>Wed, 30 Apr 2014 10:53:23 GMT</pubDate></item><item><title><![CDATA[Reply to GCC 4.4.7 vs. GCC 4.7 on Wed, 30 Apr 2014 11:46:03 GMT]]></title><description><![CDATA[<p>Hallo kkaw,</p>
<p>das mit der stufenweisen Auflösung hab ich verstanden. Das keyword template kannte ich an der Stelle allerdings nicht. Danke für die Recherche-Tips, da werde ich nebenbei mal ein wenig die Suchmaschine bemühen. <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>Vielen Dank.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396854</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396854</guid><dc:creator><![CDATA[sven_]]></dc:creator><pubDate>Wed, 30 Apr 2014 11:46:03 GMT</pubDate></item></channel></rss>