<?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[Mal kann er eine Memberfunktion aufrufen und Mal nicht.]]></title><description><![CDATA[<p>Ich verstehe die Welt wohl nicht mehr, aber bei folgendem Quelltext</p>
<pre><code>struct UID {
    explicit UID(const char *uid) { }
};

struct Test{
    Test(const UID&amp; s){}
    void fct(){}
};

const char *v=&quot;Test&quot;;

int main() {
    Test    t(UID(&quot;Test&quot;));
    t.fct();

    Test    t2(UID(v));
    t2.fct();

    return 0;
}
</code></pre>
<p>entsteht das Problem, dass das Object t die Memberfunktion fct() aufrufen kann. t2 kann dies jedoch nicht.<br />
Die Fehlermeldung (g++-4.3.2 und auch g++-3.4) ist</p>
<pre><code>Test.cc: In function ‘int main()’:
Test.cc:17: error: request for member ‘fct’ in ‘t2’, which is of non-class type ‘Test ()(UID)’
</code></pre>
<p>Ich verstehe das Problem aber nicht. Wenn ich den constructor in UID nicht explicit mache, geht es. Wenn er explicit ist, tritt das Problem auf. Wieso?</p>
<p>Kann mir da jemand weiter helfen? Ist dieses Verhalten richtig/Standard oder hat der Compiler hier einen Bug.</p>
<p>Grüße und Danke<br />
Mysterio</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/242924/mal-kann-er-eine-memberfunktion-aufrufen-und-mal-nicht</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 17:12:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/242924.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 09 Jun 2009 20:07:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mal kann er eine Memberfunktion aufrufen und Mal nicht. on Tue, 09 Jun 2009 20:07:44 GMT]]></title><description><![CDATA[<p>Ich verstehe die Welt wohl nicht mehr, aber bei folgendem Quelltext</p>
<pre><code>struct UID {
    explicit UID(const char *uid) { }
};

struct Test{
    Test(const UID&amp; s){}
    void fct(){}
};

const char *v=&quot;Test&quot;;

int main() {
    Test    t(UID(&quot;Test&quot;));
    t.fct();

    Test    t2(UID(v));
    t2.fct();

    return 0;
}
</code></pre>
<p>entsteht das Problem, dass das Object t die Memberfunktion fct() aufrufen kann. t2 kann dies jedoch nicht.<br />
Die Fehlermeldung (g++-4.3.2 und auch g++-3.4) ist</p>
<pre><code>Test.cc: In function ‘int main()’:
Test.cc:17: error: request for member ‘fct’ in ‘t2’, which is of non-class type ‘Test ()(UID)’
</code></pre>
<p>Ich verstehe das Problem aber nicht. Wenn ich den constructor in UID nicht explicit mache, geht es. Wenn er explicit ist, tritt das Problem auf. Wieso?</p>
<p>Kann mir da jemand weiter helfen? Ist dieses Verhalten richtig/Standard oder hat der Compiler hier einen Bug.</p>
<p>Grüße und Danke<br />
Mysterio</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1724110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724110</guid><dc:creator><![CDATA[mysterio]]></dc:creator><pubDate>Tue, 09 Jun 2009 20:07:44 GMT</pubDate></item><item><title><![CDATA[Reply to Mal kann er eine Memberfunktion aufrufen und Mal nicht. on Tue, 09 Jun 2009 20:23:12 GMT]]></title><description><![CDATA[<p><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="😕"
    /> <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="😕"
    /> WTF?! <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="😕"
    /> <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="😕"
    /><br />
<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="😕"
    /> <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="😕"
    /> WTF? <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="😕"
    /> <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/1724116</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724116</guid><dc:creator><![CDATA[WWAASSS?!]]></dc:creator><pubDate>Tue, 09 Jun 2009 20:23:12 GMT</pubDate></item><item><title><![CDATA[Reply to Mal kann er eine Memberfunktion aufrufen und Mal nicht. on Tue, 09 Jun 2009 20:24:46 GMT]]></title><description><![CDATA[<p>Ich habe gcc-4.1.2 und es geht auch ohne explicit nicht! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Verstehe aber auch überhaupt nicht warum das nicht geht!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1724118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724118</guid><dc:creator><![CDATA[Painkiller]]></dc:creator><pubDate>Tue, 09 Jun 2009 20:24:46 GMT</pubDate></item><item><title><![CDATA[Reply to Mal kann er eine Memberfunktion aufrufen und Mal nicht. on Tue, 09 Jun 2009 20:27:40 GMT]]></title><description><![CDATA[<p>Das hier geht:</p>
<pre><code class="language-cpp">UID u(v);
    Test t2( u ); 
    t2.fct();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1724119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724119</guid><dc:creator><![CDATA[tandem]]></dc:creator><pubDate>Tue, 09 Jun 2009 20:27:40 GMT</pubDate></item><item><title><![CDATA[Reply to Mal kann er eine Memberfunktion aufrufen und Mal nicht. on Tue, 09 Jun 2009 20:33:52 GMT]]></title><description><![CDATA[<p>Die Zeile</p>
<pre><code class="language-cpp">Test    t2(UID(v));
</code></pre>
<p>scheint als Funktionsdeklaration aufgefasst zu werden.</p>
<p>Was mich allerdings ein wenig erstaunt, da <code>UID(v)</code> eigentlich keine Parameterdeklaration ist...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1724123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724123</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 09 Jun 2009 20:33:52 GMT</pubDate></item><item><title><![CDATA[Reply to Mal kann er eine Memberfunktion aufrufen und Mal nicht. on Tue, 09 Jun 2009 20:33:57 GMT]]></title><description><![CDATA[<p>tandem schrieb:</p>
<blockquote>
<p>Das hier geht:</p>
<pre><code class="language-cpp">UID u(v);
    Test t2( u ); 
    t2.fct();
</code></pre>
</blockquote>
<p>Ja stimmt, hatte ich auch schon rausgefunden, aber leider vergessen mit reinzuschreiben.</p>
<p>Ich versteh aber nicht warum es so geht, aber wenn ich es als temporäres Objekt habe nicht. Ist mir nicht klar, zumal der Fehler nicht beim Aufbau des Objektes passiert, sondern später.</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1724124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724124</guid><dc:creator><![CDATA[mysterio]]></dc:creator><pubDate>Tue, 09 Jun 2009 20:33:57 GMT</pubDate></item><item><title><![CDATA[Reply to Mal kann er eine Memberfunktion aufrufen und Mal nicht. on Tue, 09 Jun 2009 20:40:59 GMT]]></title><description><![CDATA[<p>Ich glaube wirklich dass es ein Bug Report wert ist!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1724129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724129</guid><dc:creator><![CDATA[LALALALA]]></dc:creator><pubDate>Tue, 09 Jun 2009 20:40:59 GMT</pubDate></item><item><title><![CDATA[Reply to Mal kann er eine Memberfunktion aufrufen und Mal nicht. on Tue, 09 Jun 2009 20:41:31 GMT]]></title><description><![CDATA[<p>Also folgende Sachen gehen auch noch:</p>
<pre><code class="language-cpp">Test t2( UID(static_cast&lt;const char*&gt;(v)) );
</code></pre>
<p>und</p>
<pre><code class="language-cpp">Test t2( (UID(v)) );
</code></pre>
<p>Keine Ahnung was da läuft...<br />
Insbesondere das Zweite gibt mir zu denken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1724130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724130</guid><dc:creator><![CDATA[tandem]]></dc:creator><pubDate>Tue, 09 Jun 2009 20:41:31 GMT</pubDate></item><item><title><![CDATA[Reply to Mal kann er eine Memberfunktion aufrufen und Mal nicht. on Tue, 09 Jun 2009 20:43:00 GMT]]></title><description><![CDATA[<p>Du hast meinen Beitrag wohl übersehen, da du 5 Sekunden später auch gleich gepostet hast... <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>Unter MSVC++ erhält man ebenso einen Fehler. Wie gesagt erkennt der Compiler die Zeile als Funktionsdeklaration. Ich bin selbst ein wenig verwirrt; eventuell hat das mit der Auswertungs-/Parserreihenfolge des Kompilierens zu tun...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1724131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724131</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 09 Jun 2009 20:43:00 GMT</pubDate></item><item><title><![CDATA[Reply to Mal kann er eine Memberfunktion aufrufen und Mal nicht. on Tue, 09 Jun 2009 20:46:36 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Du hast meinen Beitrag wohl übersehen, da du 5 Sekunden später auch gleich gepostet hast... <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>
</blockquote>
<p>Ja hatte ich wohl.</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Unter MSVC++ erhält man ebenso einen Fehler. Wie gesagt erkennt der Compiler die Zeile als Funktionsdeklaration. Ich bin selbst ein wenig verwirrt; eventuell hat das mit der Auswertungs-/Parserreihenfolge des Kompilierens zu tun...</p>
</blockquote>
<p>Und was kann ich dann jetzt daraus schließen? Haben beide Compiler einen bug? Ist dies ein Problem im Standard? Habe keine Ahnung. Ich meine es gibt ja workarounds, wie tandem ja schon gezeigt hat. Aber ist dies die Lösung?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1724137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724137</guid><dc:creator><![CDATA[mysterio]]></dc:creator><pubDate>Tue, 09 Jun 2009 20:46:36 GMT</pubDate></item><item><title><![CDATA[Reply to Mal kann er eine Memberfunktion aufrufen und Mal nicht. on Tue, 09 Jun 2009 21:11:46 GMT]]></title><description><![CDATA[<p>Das Problem läßt sich auf folgende Zeile reduzieren:</p>
<pre><code class="language-cpp">void foo (int (bar));
</code></pre>
<p>MSVC, GCC, BCC und Comeau compilieren das anstandslos. Bei BCC resultiert <code>typeid (foo).name ()</code> in &quot;void (*)(int)&quot;; was aus dem <code>bar</code> wird, ist mir momentan nicht nachvollziehbar.</p>
<p>Ich vermute ein parserbedingtes Defizit. Sobald man <code>bar</code> durch einen bekannten Typen ersetzt, z.B. int, wird das Argument zu einem Funktionszeiger (&quot;void (<em>)(int (</em>)(int))&quot;).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1724152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724152</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Tue, 09 Jun 2009 21:11:46 GMT</pubDate></item><item><title><![CDATA[Reply to Mal kann er eine Memberfunktion aufrufen und Mal nicht. on Tue, 09 Jun 2009 21:39:36 GMT]]></title><description><![CDATA[<p>Sehr bekanntes Problem. Eine etwas bekanntere Version:</p>
<pre><code class="language-cpp">std::vector&lt;double&gt; vec(
	std::istream_iterator&lt;double&gt;(std::cin),
	std::istream_iterator&lt;double&gt;());
</code></pre>
<p>Hier passiert der gleiche Fehler.<br />
Sobald man diese Version verwendet, um ein Objekt zu konstruieren, darf man leider nicht bei allen Argumenten einen Typen angeben. (Ich hoffe den Satz kann man verstehen :))<br />
Also sowas würde bereits wieder funktionieren:</p>
<pre><code class="language-cpp">std::istream_iterator&lt;double&gt; iend;

std::vector&lt;double&gt; vec(
	std::istream_iterator&lt;double&gt;(std::cin),
	iend);
</code></pre>
<p>Entweder man nimmt die Argumente raus und erstellt sie, bevor man sie dem Konstruktor übergibt. Oder man verwendet die alternative Schreibeweise:</p>
<pre><code class="language-cpp">std::vector&lt;double&gt; vec =
	std::vector&lt;double&gt;(
		std::istream_iterator&lt;double&gt;(std::cin),
		std::istream_iterator&lt;double&gt;());

// bzw. auf das andere Beispiel bezogen:
Test t2 = Test(UID(v));

// bzw. hier sogar, da der Konstruktor von Test nicht explicit ist
// und nur ein Argument erwartet wird:
Test t2 = UID(v);
</code></pre>
<p>Hat also überhaupt nichts mit einem Bug zu tun, sondern ist absolut korrektes Standardverhalten. Auch wenn der Standard in dem Bereich ein wenig unsinnig ist. Ich habe bisher keinen Fall kennen gelernt, wo eine Funktionsdeklaration in einer Funktion wirklich sinnvoll war.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1724167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724167</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 09 Jun 2009 21:39:36 GMT</pubDate></item><item><title><![CDATA[Reply to Mal kann er eine Memberfunktion aufrufen und Mal nicht. on Tue, 09 Jun 2009 21:44:14 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Sehr bekanntes Problem.</p>
</blockquote>
<p>Dann sieh dir bitte mal meine Reduktion an und sage mir, was der Compiler mit <code>bar</code> macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1724168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724168</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Tue, 09 Jun 2009 21:44:14 GMT</pubDate></item><item><title><![CDATA[Reply to Mal kann er eine Memberfunktion aufrufen und Mal nicht. on Tue, 09 Jun 2009 21:50:35 GMT]]></title><description><![CDATA[<p>Wusste ich gar nicht, dass es bei der Funktionsdeklaration gültige Syntax ist, den Parameternamen einzuklammern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1724171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724171</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Tue, 09 Jun 2009 21:50:35 GMT</pubDate></item><item><title><![CDATA[Reply to Mal kann er eine Memberfunktion aufrufen und Mal nicht. on Tue, 09 Jun 2009 21:53:52 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>Dravere schrieb:</p>
<blockquote>
<p>Sehr bekanntes Problem.</p>
</blockquote>
<p>Dann sieh dir bitte mal meine Reduktion an und sage mir, was der Compiler mit <code>bar</code> macht.</p>
</blockquote>
<p>Er lässt es dort, für ihn ist es das gleiche wie:</p>
<pre><code class="language-cpp">void foo(int bar);
</code></pre>
<p>Diese Klammerung kann man zum Teil auch sinnvoll einsetzen:</p>
<pre><code class="language-cpp">template&lt;typename T, std::size_t N&gt;
std::size_t getArraySize(T const (&amp;arr)[N])
{
  return N;
}
</code></pre>
<p>Da hast du auch solche Klammern, nur sind sie hier von belang. Beim anderen sind sie halt überflüssig.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1724174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724174</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 09 Jun 2009 21:53:52 GMT</pubDate></item><item><title><![CDATA[Reply to Mal kann er eine Memberfunktion aufrufen und Mal nicht. on Tue, 09 Jun 2009 22:27:56 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>audacia schrieb:</p>
<blockquote>
<p>Dravere schrieb:</p>
<blockquote>
<p>Sehr bekanntes Problem.</p>
</blockquote>
<p>Dann sieh dir bitte mal meine Reduktion an und sage mir, was der Compiler mit <code>bar</code> macht.</p>
</blockquote>
<p>Er lässt es dort, für ihn ist es das gleiche wie:</p>
<pre><code class="language-cpp">void foo(int bar);
</code></pre>
</blockquote>
<p>Aah, daß der Parameter in Klammern gesetzt werden darf, war mir nicht mehr bewußt.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Diese Klammerung kann man zum Teil auch sinnvoll einsetzen:</p>
<pre><code class="language-cpp">template&lt;typename T, std::size_t N&gt;
std::size_t getArraySize(T const (&amp;arr)[N])
{
  return N;
}
</code></pre>
</blockquote>
<p>Tatsächlich - ich kann mich sogar erinnern, das schon einmal benutzt zu haben.</p>
<p>Ist wohl doch schon etwas spät <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1724189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724189</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Tue, 09 Jun 2009 22:27:56 GMT</pubDate></item><item><title><![CDATA[Reply to Mal kann er eine Memberfunktion aufrufen und Mal nicht. on Wed, 10 Jun 2009 15:01:57 GMT]]></title><description><![CDATA[<p>Danke fuer die Klaerung.</p>
<p>Es ist also ein Problem mit der Kontextsensitivitaet von C/C++. Weiss jemand, ob dies vielleicht in der zukuenftigen Version des Standards geaendert wird.</p>
<p>Gruss</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1724608</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724608</guid><dc:creator><![CDATA[mysterio]]></dc:creator><pubDate>Wed, 10 Jun 2009 15:01:57 GMT</pubDate></item></channel></rss>