I was compiling a C++ program in Cygwin using g++ and I had a class whose constructor had no arguments. I had the lines:
MyClass myObj();
myObj.function1();
And when trying to compile it, I got the message:
error: request for member 'function1' in 'myObj', which is of non-class type 'MyClass ()()'
After a little research, I found that the fix was to change that first line to
MyClass myObj;
I could swear I've done empty constructor declarations with parentheses in C++ before. Is this probably a limitation of the compiler I'm using or does the language standard really say don't use parentheses for a constructor without arguments?
I found this in the C++ standard (§8.5.8):
Yet another most-vexing-parse hit. See for instance Sort function does not work with function object created on stack?
This is a fairly well known issue, and isn't compiler dependent. Essentially, what you were doing was declaring a function returning type MyObj. Not surprisingly, you couldn't call its constructor. See the C++ faq lite for a good explanation
Although
MyClass myObj();
could be parsed as an object definition with an empty initializer or a function declaration the language standard specifies that the ambiguity is always resolved in favour of the function declaration. An empty parentheses initializer is allowed in other contexts e.g. in anew
expression or constructing a value-initialized temporary.That's parsed as a function declaration, the function is called myObj, takes no arguments and returns MyClass object. I've never seen a compiler accepting that. On the other hand
MyClass* myPtr = new MyClass();
is acceptable, may be that got you confused?Your line makes the compiler think you are declaring a function named
myObj
which takes no arguments and returns aMyClass
. This ambiguity resolution is indeed annoying.