Ich kompilierte ein C++ - Programm in Cygwin mit g ++ und ich hatte eine Klasse, deren Konstruktor keine Argumente hatte. Ich hatte die Zeilen:Sind für einen Konstruktor ohne Argumente keine Sprachklammern ein Sprachstandard?
MyClass myObj();
myObj.function1();
Und wenn es zu kompilieren versuchen, bekam ich die Nachricht:
Fehler: Antrag auf Mitglieder function1 'in ‚myObj‘, die von nicht-Klasse Typ ‚MyClass()() '
Nach ein wenig Forschung, fand ich, dass die Lösung war, diese erste Zeile zu ändern MyClass myObj;
Ich könnte schwören, ich habe leere Konstruktor Deklarationen mit Klammern in C++ vor getan. Ist das wahrscheinlich eine Einschränkung des Compilers, den ich verwende, oder sagt der Sprachstandard wirklich, dass keine Klammern für einen Konstruktor ohne Argumente verwendet werden?
Um zu erweitern - es ist nur ein Problem in bestimmten Kontexten. Schreiben Sie zum Beispiel "throw myexceptionclass();" und es gibt keine Verwirrung. Die Sprache ist im Petes-Kontext mehrdeutig, aber die Disambiguierungsregeln (der Grund, warum die Sprache streng genommen nicht wirklich mehrdeutig ist) wählen eine Interpretation aus. Natürlich bedeuten die Regeln der Disambiguierung, dass die Sprache nicht wirklich zweideutig ist - aber Parsing-Experten sagen es trotzdem, also darf ich auch! Die häufigsten Disambiguierungsregeln in vielen Sprachen sind Operatorenpräzedenz und Assoziativität. C und C++ sind vieldeutiger und es gibt einige seltsame Probleme. – Steve314