Standardkonstruktor in einem Konstruktoraufruf aufrufen



  • Nexus schrieb:

    Das Problem ist bekannt als "Most Vexing Parse" und beschreibt eine Mehrdeutigkeit in der C++-Syntax. Und zwar werden die entsprechenden Variablendefinitionen als Funktionsdeklarationen erkannt.

    Danke, mein Problem war, dass ich nicht wusste, dass

    MyStruct()
    

    als namenloser Funktionszeiger interpretiert werden kann (stimmt das so 😕 )

    ich kannte nur

    MyStruct(*)()
    

    Sorry wegen der Templates...

    Gruß
    Matze



  • Kennste std::function?
    Da schreibste ja auch void() in den Parametern.



  • Nathan schrieb:

    Kennste std::function?
    Da schreibste ja auch void() in den Parametern.

    stimmt 😮



  • MatzeHHC schrieb:

    Danke, mein Problem war, dass ich nicht wusste, dass

    MyStruct()
    

    als namenloser Funktionszeiger interpretiert werden kann (stimmt das so 😕 )

    Nein, mit Funktionszeigern hat das nichts zu tun.

    MyClass<MyStruct> objC (MyStruct());
    

    ist aufgrund einer fragwürdigen Syntaxregel das gleiche wie

    MyClass<MyStruct> objC (MyStruct);
    

    was eine Funktionsdeklaration darstellt.

    Ich bin mir auch nicht sicher, wer es für eine gute Idee hielt, Klammern um Parametertypen zuzulassen. Oder generell um Typen in Deklarationskontexten.

    Nathan schrieb:

    Kennste std::function?
    Da schreibste ja auch void() in den Parametern.

    Das void() bedeutet was anderes als hier. Insbesondere ist es kein Funktionszeiger.



  • Nexus schrieb:

    MyClass<MyStruct> objC (MyStruct());
    

    ist aufgrund einer fragwürdigen Syntaxregel das gleiche wie

    MyClass<MyStruct> objC (MyStruct);
    

    was eine Funktionsdeklaration darstellt.

    Laut:

    MSVC schrieb:

    warning C4930: 'MyClass<MyStruct> objC(MyStruct (__cdecl *)(void))': Funktion mit Prototyp wurde nicht aufgerufen (war eine Variablendefinition gemeint?)

    scheint VC daraus aber:

    MyClass<MyStruct> objC(MyStruct (__cdecl *)(void))
    

    zu machen.
    Laut ideone auch: http://ideone.com/IH92h2

    Insbesondere ist es kein Funktionszeiger.

    Was dann?



  • Nexus schrieb:

    MatzeHHC schrieb:

    Danke, mein Problem war, dass ich nicht wusste, dass

    MyStruct()
    

    als namenloser Funktionszeiger interpretiert werden kann (stimmt das so 😕 )

    Nein, mit Funktionszeigern hat das nichts zu tun.

    MyClass<MyStruct> objC (MyStruct());
    

    ist aufgrund einer fragwürdigen Syntaxregel das gleiche wie

    MyClass<MyStruct> objC (MyStruct);
    

    was eine Funktionsdeklaration darstellt.

    Da verstehe ich meine Compiler-Warnung aber anders:

    Compiler schrieb:

    ...\main.cpp(40): warning C4930: 'MyClass<MyStruct> objC(MyStruct (__cdecl *)(void))': Funktion mit Prototyp wurde nicht aufgerufen (war eine Variablendefinition gemeint?)

    Und den Wikipediaeintrag:
    http://en.wikipedia.org/wiki/Most_vexing_parse

    Wikipedia schrieb:

    The line

    TimeKeeper time_keeper(Timer());
    

    could be disambiguated either as

    1. a variable definition for variable time_keeper of class TimeKeeper, passed an anonymous instance of class Timer or
    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++)

    Jetzt bin ich verwirrt 😕 😃



  • Ihr habt Recht, die Klammern stehen ja nach dem Parametertyp. Wie auch immer, jedenfalls wird die naheliegende Variante nicht bevorzugt 😉

    Nathan schrieb:

    Insbesondere ist es kein Funktionszeiger.

    Was dann?

    Eine Funktion.



  • Nexus schrieb:

    Nathan schrieb:

    Insbesondere ist es kein Funktionszeiger.

    Was dann?

    Eine Funktion.

    ...was im Kontext einer Funktionsdeklaration scheinbar dasselbe ist:
    http://ideone.com/3cPHMu


  • Mod

    Nathan schrieb:

    was im Kontext einer Funktionsdeklaration scheinbar dasselbe ist

    Du meinst wohl, im Kontext eines Funktionsparameters? Ist dasselbe wie mit Arrays

    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.

    Nexus schrieb:

    Ein Funktionstyp.

    FTFY



  • Arcoth schrieb:

    Ist dasselbe wie mit Arrays

    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.

    Stimmt, mit Arrays ist das ja gleich.


Anmelden zum Antworten