<?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[Standardkonstruktor in einem Konstruktoraufruf aufrufen]]></title><description><![CDATA[<p>Hallo Community,</p>
<p>ich habe ein Problem mit einem Konstruktoraufruf.<br />
Ich zeige zunaechst den Code (die Fragen stehen im Prinzip auch schon in den Kommentaren). Lasst euch nicht von den Templates verwirren, die haben (meine ich) nichts mit dem Problem zu tun. Ich bin nur beim lernen von Template-Programmierung drauf gestossen.</p>
<pre><code>#include &lt;initializer_list&gt;
#include &lt;iostream&gt;

using namespace std;

struct MyStruct {
    int x;
    MyStruct (int x = 1) : x (x) {}
    void operator() () {
        // mach was mit x
    }
};

template&lt;class T&gt;
class MyClass {
  public:
    MyClass (T const&amp; t = MyStruct() ) : t (t) {}

    void doSomething() const {
        // mach was mit t
    }
  private:
    T t;
};

template&lt;class T&gt;
void func (T t) {
    t();
}

int main() {

    MyClass&lt;MyStruct&gt; objA;                     // a) geht (wie erwartet)
    objA.doSomething();

    MyClass&lt;MyStruct&gt; objB();                   // b) geht nicht, (wie erwartet)
    objB.doSomething();

    MyClass&lt;MyStruct&gt; objC (MyStruct() );       // c) geht nicht, warum? d) und f) gehen doch auch !?
    objC.doSomething();

    MyClass&lt;MyStruct&gt; objD (MyStruct (42) );    // d) geht (wie erwartet)
    objD.doSomething();

    MyClass&lt;MyStruct&gt; objE { MyStruct() };    // e) geht (wie erwartet)
    objE.doSomething();

    func (MyStruct() );                         // f) geht (wie erwartet)

    return EXIT_SUCCESS;
}
</code></pre>
<p>a), b) und e) sind mir soweit eigentlich klar. Mein Problem ist, dass c) nicht geht, d) und f) aber schon. Was uebersehe ich da?</p>
<p>Der Compiler meckert in den Zeilen 37 und 40:</p>
<blockquote>
<p>error C2228: Links von &quot;.doSomething&quot; muss sich eine Klasse/Struktur/Union befinden.</p>
</blockquote>
<p>Wenn ich diese Zeilen auskommentiere (also <code>doSomething()</code> fuer <code>objB</code> und <code>objC</code> nicht aufrufe), bekomme ich folgende Warnung:</p>
<blockquote>
<p>...\main.cpp(37): warning C4930: 'MyClass&lt;MyStruct&gt; objB(void)': Funktion mit Prototyp wurde nicht aufgerufen (war eine Variablendefinition gemeint?)<br />
...\main.cpp(40): warning C4930: 'MyClass&lt;MyStruct&gt; objC(MyStruct (__cdecl *)(void))': Funktion mit Prototyp wurde nicht aufgerufen (war eine Variablendefinition gemeint?)</p>
</blockquote>
<p>Soll das heissen, dass ich hier eine Funktion deklariert habe, die <code>MyClass&lt;MyStruct&gt;</code> zurueckgibt und als Parameter einen Zeiger auf eine Funktion erwartet, die ein <code>MyStruct</code> zurueckgibt?<br />
Das wuerde doch eigentlich so aussehen:</p>
<pre><code>MyClass&lt;MyStruct&gt; objC (MyStruct (*func) () );
</code></pre>
<p>Aber vor allem wundert es mich, dass ich auf dieses Problem noch nicht frueher gestossen bin <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>
<p>Als IDE verwende ich Visual Studio 2013 mit entsprechendem Compiler (Toolset v120).</p>
<p>Vielen Dank fuer eure Hilfe!</p>
<p>Gruss<br />
Matze</p>
<p>Edit: '=' bei objE entfernt</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/324806/standardkonstruktor-in-einem-konstruktoraufruf-aufrufen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Jul 2026 18:10:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/324806.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 02 Apr 2014 14:24:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Standardkonstruktor in einem Konstruktoraufruf aufrufen on Wed, 02 Apr 2014 14:56:56 GMT]]></title><description><![CDATA[<p>Hallo Community,</p>
<p>ich habe ein Problem mit einem Konstruktoraufruf.<br />
Ich zeige zunaechst den Code (die Fragen stehen im Prinzip auch schon in den Kommentaren). Lasst euch nicht von den Templates verwirren, die haben (meine ich) nichts mit dem Problem zu tun. Ich bin nur beim lernen von Template-Programmierung drauf gestossen.</p>
<pre><code>#include &lt;initializer_list&gt;
#include &lt;iostream&gt;

using namespace std;

struct MyStruct {
    int x;
    MyStruct (int x = 1) : x (x) {}
    void operator() () {
        // mach was mit x
    }
};

template&lt;class T&gt;
class MyClass {
  public:
    MyClass (T const&amp; t = MyStruct() ) : t (t) {}

    void doSomething() const {
        // mach was mit t
    }
  private:
    T t;
};

template&lt;class T&gt;
void func (T t) {
    t();
}

int main() {

    MyClass&lt;MyStruct&gt; objA;                     // a) geht (wie erwartet)
    objA.doSomething();

    MyClass&lt;MyStruct&gt; objB();                   // b) geht nicht, (wie erwartet)
    objB.doSomething();

    MyClass&lt;MyStruct&gt; objC (MyStruct() );       // c) geht nicht, warum? d) und f) gehen doch auch !?
    objC.doSomething();

    MyClass&lt;MyStruct&gt; objD (MyStruct (42) );    // d) geht (wie erwartet)
    objD.doSomething();

    MyClass&lt;MyStruct&gt; objE { MyStruct() };    // e) geht (wie erwartet)
    objE.doSomething();

    func (MyStruct() );                         // f) geht (wie erwartet)

    return EXIT_SUCCESS;
}
</code></pre>
<p>a), b) und e) sind mir soweit eigentlich klar. Mein Problem ist, dass c) nicht geht, d) und f) aber schon. Was uebersehe ich da?</p>
<p>Der Compiler meckert in den Zeilen 37 und 40:</p>
<blockquote>
<p>error C2228: Links von &quot;.doSomething&quot; muss sich eine Klasse/Struktur/Union befinden.</p>
</blockquote>
<p>Wenn ich diese Zeilen auskommentiere (also <code>doSomething()</code> fuer <code>objB</code> und <code>objC</code> nicht aufrufe), bekomme ich folgende Warnung:</p>
<blockquote>
<p>...\main.cpp(37): warning C4930: 'MyClass&lt;MyStruct&gt; objB(void)': Funktion mit Prototyp wurde nicht aufgerufen (war eine Variablendefinition gemeint?)<br />
...\main.cpp(40): warning C4930: 'MyClass&lt;MyStruct&gt; objC(MyStruct (__cdecl *)(void))': Funktion mit Prototyp wurde nicht aufgerufen (war eine Variablendefinition gemeint?)</p>
</blockquote>
<p>Soll das heissen, dass ich hier eine Funktion deklariert habe, die <code>MyClass&lt;MyStruct&gt;</code> zurueckgibt und als Parameter einen Zeiger auf eine Funktion erwartet, die ein <code>MyStruct</code> zurueckgibt?<br />
Das wuerde doch eigentlich so aussehen:</p>
<pre><code>MyClass&lt;MyStruct&gt; objC (MyStruct (*func) () );
</code></pre>
<p>Aber vor allem wundert es mich, dass ich auf dieses Problem noch nicht frueher gestossen bin <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>
<p>Als IDE verwende ich Visual Studio 2013 mit entsprechendem Compiler (Toolset v120).</p>
<p>Vielen Dank fuer eure Hilfe!</p>
<p>Gruss<br />
Matze</p>
<p>Edit: '=' bei objE entfernt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392373</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392373</guid><dc:creator><![CDATA[MatzeHHC]]></dc:creator><pubDate>Wed, 02 Apr 2014 14:56:56 GMT</pubDate></item><item><title><![CDATA[Reply to Standardkonstruktor in einem Konstruktoraufruf aufrufen on Wed, 02 Apr 2014 14:32:27 GMT]]></title><description><![CDATA[<p>Das Problem ist bekannt als &quot;Most Vexing Parse&quot; und beschreibt eine Mehrdeutigkeit in der C++-Syntax. Und zwar werden die entsprechenden Variablendefinitionen als Funktionsdeklarationen erkannt.</p>
<p>MatzeHHC schrieb:</p>
<blockquote>
<p>Lasst euch nicht von den Templates verwirren, die haben (meine ich) nichts mit dem Problem zu tun.</p>
</blockquote>
<p>Dann lass sie doch nächstes Mal weg. Ideal ist ein vollständiges, kompilierbares Minimalbeispiel, anhand dessen wir das Problem erkennen können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392375</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 02 Apr 2014 14:32:27 GMT</pubDate></item><item><title><![CDATA[Reply to Standardkonstruktor in einem Konstruktoraufruf aufrufen on Wed, 02 Apr 2014 15:01:53 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Das Problem ist bekannt als &quot;Most Vexing Parse&quot; und beschreibt eine Mehrdeutigkeit in der C++-Syntax. Und zwar werden die entsprechenden Variablendefinitionen als Funktionsdeklarationen erkannt.</p>
</blockquote>
<p>Danke, mein Problem war, dass ich nicht wusste, dass</p>
<pre><code>MyStruct()
</code></pre>
<p>als namenloser Funktionszeiger interpretiert werden kann (stimmt das so <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>
<p>ich kannte nur</p>
<pre><code>MyStruct(*)()
</code></pre>
<p>Sorry wegen der Templates...</p>
<p>Gruß<br />
Matze</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392382</guid><dc:creator><![CDATA[MatzeHHC]]></dc:creator><pubDate>Wed, 02 Apr 2014 15:01:53 GMT</pubDate></item><item><title><![CDATA[Reply to Standardkonstruktor in einem Konstruktoraufruf aufrufen on Wed, 02 Apr 2014 15:16:55 GMT]]></title><description><![CDATA[<p>Kennste std::function?<br />
Da schreibste ja auch void() in den Parametern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392386</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392386</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 02 Apr 2014 15:16:55 GMT</pubDate></item><item><title><![CDATA[Reply to Standardkonstruktor in einem Konstruktoraufruf aufrufen on Wed, 02 Apr 2014 15:28:33 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Kennste std::function?<br />
Da schreibste ja auch void() in den Parametern.</p>
</blockquote>
<p>stimmt <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="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392389</guid><dc:creator><![CDATA[MatzeHHC]]></dc:creator><pubDate>Wed, 02 Apr 2014 15:28:33 GMT</pubDate></item><item><title><![CDATA[Reply to Standardkonstruktor in einem Konstruktoraufruf aufrufen on Wed, 02 Apr 2014 15:29:53 GMT]]></title><description><![CDATA[<p>MatzeHHC schrieb:</p>
<blockquote>
<p>Danke, mein Problem war, dass ich nicht wusste, dass</p>
<pre><code>MyStruct()
</code></pre>
<p>als namenloser Funktionszeiger interpretiert werden kann (stimmt das so <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>
</blockquote>
<p>Nein, mit Funktionszeigern hat das nichts zu tun.</p>
<pre><code>MyClass&lt;MyStruct&gt; objC (MyStruct());
</code></pre>
<p>ist aufgrund einer fragwürdigen Syntaxregel das gleiche wie</p>
<pre><code>MyClass&lt;MyStruct&gt; objC (MyStruct);
</code></pre>
<p>was eine Funktionsdeklaration darstellt.</p>
<p>Ich bin mir auch nicht sicher, wer es für eine gute Idee hielt, Klammern um Parametertypen zuzulassen. Oder generell um Typen in Deklarationskontexten.</p>
<p>Nathan schrieb:</p>
<blockquote>
<p>Kennste std::function?<br />
Da schreibste ja auch void() in den Parametern.</p>
</blockquote>
<p>Das <code>void()</code> bedeutet was anderes als hier. Insbesondere ist es kein Funktionszeiger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392390</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392390</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 02 Apr 2014 15:29:53 GMT</pubDate></item><item><title><![CDATA[Reply to Standardkonstruktor in einem Konstruktoraufruf aufrufen on Wed, 02 Apr 2014 15:47:05 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<pre><code>MyClass&lt;MyStruct&gt; objC (MyStruct());
</code></pre>
<p>ist aufgrund einer fragwürdigen Syntaxregel das gleiche wie</p>
<pre><code>MyClass&lt;MyStruct&gt; objC (MyStruct);
</code></pre>
<p>was eine Funktionsdeklaration darstellt.</p>
</blockquote>
<p>Laut:</p>
<p>MSVC schrieb:</p>
<blockquote>
<p>warning C4930: 'MyClass&lt;MyStruct&gt; objC(MyStruct (__cdecl *)(void))': Funktion mit Prototyp wurde nicht aufgerufen (war eine Variablendefinition gemeint?)</p>
</blockquote>
<p>scheint VC daraus aber:</p>
<pre><code>MyClass&lt;MyStruct&gt; objC(MyStruct (__cdecl *)(void))
</code></pre>
<p>zu machen.<br />
Laut ideone auch: <a href="http://ideone.com/IH92h2" rel="nofollow">http://ideone.com/IH92h2</a></p>
<blockquote>
<p>Insbesondere ist es kein Funktionszeiger.</p>
</blockquote>
<p>Was dann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392392</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392392</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 02 Apr 2014 15:47:05 GMT</pubDate></item><item><title><![CDATA[Reply to Standardkonstruktor in einem Konstruktoraufruf aufrufen on Wed, 02 Apr 2014 15:47:53 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>MatzeHHC schrieb:</p>
<blockquote>
<p>Danke, mein Problem war, dass ich nicht wusste, dass</p>
<pre><code>MyStruct()
</code></pre>
<p>als namenloser Funktionszeiger interpretiert werden kann (stimmt das so <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>
</blockquote>
<p>Nein, mit Funktionszeigern hat das nichts zu tun.</p>
<pre><code>MyClass&lt;MyStruct&gt; objC (MyStruct());
</code></pre>
<p>ist aufgrund einer fragwürdigen Syntaxregel das gleiche wie</p>
<pre><code>MyClass&lt;MyStruct&gt; objC (MyStruct);
</code></pre>
<p>was eine Funktionsdeklaration darstellt.</p>
</blockquote>
<p>Da verstehe ich meine Compiler-Warnung aber anders:</p>
<p>Compiler schrieb:</p>
<blockquote>
<p>...\main.cpp(40): warning C4930: 'MyClass&lt;MyStruct&gt; objC(MyStruct (__cdecl *)(void))': Funktion mit Prototyp wurde nicht aufgerufen (war eine Variablendefinition gemeint?)</p>
</blockquote>
<p>Und den Wikipediaeintrag:<br />
<a href="http://en.wikipedia.org/wiki/Most_vexing_parse" rel="nofollow">http://en.wikipedia.org/wiki/Most_vexing_parse</a></p>
<p>Wikipedia schrieb:</p>
<blockquote>
<p>The line</p>
<pre><code>TimeKeeper time_keeper(Timer());
</code></pre>
<p>could be disambiguated either as</p>
<p>1. a variable definition for variable time_keeper of class TimeKeeper, passed an anonymous instance of class Timer or<br />
2. a function declaration for a function time_keeper which returns an object of type TimeKeeper and takes a single (unnamed) argument which is a function returning type Timer (and taking no input). (See Function object#In C and C++)</p>
</blockquote>
<p>Jetzt bin ich verwirrt <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/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392394</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392394</guid><dc:creator><![CDATA[MatzeHHC]]></dc:creator><pubDate>Wed, 02 Apr 2014 15:47:53 GMT</pubDate></item><item><title><![CDATA[Reply to Standardkonstruktor in einem Konstruktoraufruf aufrufen on Wed, 02 Apr 2014 15:56:15 GMT]]></title><description><![CDATA[<p>Ihr habt Recht, die Klammern stehen ja nach dem Parametertyp. Wie auch immer, jedenfalls wird die naheliegende Variante nicht bevorzugt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Nathan schrieb:</p>
<blockquote>
<blockquote>
<p>Insbesondere ist es kein Funktionszeiger.</p>
</blockquote>
<p>Was dann?</p>
</blockquote>
<p>Eine Funktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392398</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 02 Apr 2014 15:56:15 GMT</pubDate></item><item><title><![CDATA[Reply to Standardkonstruktor in einem Konstruktoraufruf aufrufen on Wed, 02 Apr 2014 16:39:33 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Nathan schrieb:</p>
<blockquote>
<blockquote>
<p>Insbesondere ist es kein Funktionszeiger.</p>
</blockquote>
<p>Was dann?</p>
</blockquote>
<p>Eine Funktion.</p>
</blockquote>
<p>...was im Kontext einer Funktionsdeklaration scheinbar dasselbe ist:<br />
<a href="http://ideone.com/3cPHMu" rel="nofollow">http://ideone.com/3cPHMu</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392406</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392406</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 02 Apr 2014 16:39:33 GMT</pubDate></item><item><title><![CDATA[Reply to Standardkonstruktor in einem Konstruktoraufruf aufrufen on Wed, 02 Apr 2014 17:13:08 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>was im Kontext einer Funktionsdeklaration scheinbar dasselbe ist</p>
</blockquote>
<p>Du meinst wohl, im Kontext eines Funktionsparameters? Ist dasselbe wie mit Arrays</p>
<blockquote>
<p>After determining the type of each parameter, any parameter of type “array of T” or “function returning T” is adjusted to be “pointer to T” or “pointer to function returning T,” respectively.</p>
</blockquote>
<p>Nexus schrieb:</p>
<blockquote>
<p>Ein Funktionstyp.</p>
</blockquote>
<p>FTFY</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392411</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 02 Apr 2014 17:13:08 GMT</pubDate></item><item><title><![CDATA[Reply to Standardkonstruktor in einem Konstruktoraufruf aufrufen on Wed, 02 Apr 2014 17:16:05 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Ist dasselbe wie mit Arrays</p>
<blockquote>
<p>After determining the type of each parameter, any parameter of type “array of T” or “function returning T” is adjusted to be “pointer to T” or “pointer to function returning T,” respectively.</p>
</blockquote>
</blockquote>
<p>Stimmt, mit Arrays ist das ja gleich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392413</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 02 Apr 2014 17:16:05 GMT</pubDate></item></channel></rss>