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/IH92h2Insbesondere 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_parseWikipedia 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
-
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.