Unsolved Creator: Completion no longer adds closing semicolon
-
In previous versions of Qt Creator, when I started typing:
class X {
...and hit enter, I got
class X { };
which is syntactically correct.
Since upgrading to 4.5.0, I get the same, but without the semicolon at the end. Until I add the semicolon, the result will not compile (and various autosuggest features may not work).
Does anyone else observe this behavior? I could not find a bug report for this.
EDIT: Same for enum, as stated by others
-
Confirmed on my end: Qt Creator 4.5, Linux 64 bit - I also get no closing semicolon and it definitely used to work in previous QtC versions.
-
Can't tell if it was previously the case, I usually make a new file for each class, but I noticed this for enumerations as well.
I Could swear that before 4.5 the autocompleter made the semicolon there too. -
@J.Hilk said in Creator: Completion no longer adds closing semicolon:
I Could swear that before 4.5 the autocompleter made the semicolon there too.
Yep, it did.
So, @Asperamanca will you create a bug report for this? If yes please post the link here, I'll upvote it.
-
@sierdzio @Asperamanca @J-Hilk:
Looks like this one is related to https://bugreports.qt.io/browse/QTCREATORBUG-18872
The reason to change the brace insertion was: https://bugreports.qt.io/browse/QTCREATORBUG-15073
So please, someone create a report for this regression too. Thanks.
-
I can do that via support.
EDIT: Thanks for confirming this. Have now raised via support.
-
Please don't shoot me for asking this here --- technically I guess it's OT --- but I have wondered (I'm not a C++-er): why does a C++
class X { ... }
statement/construct actually need a terminating semi-colon? Is it that you can optionally write something at the end, like{ ... } variable, *pointer;, like you can withstruct { ... }
?? -
@JonB said in Creator: Completion no longer adds closing semicolon:
Please don't shoot me for asking this here --- technically I guess it's OT --- but I have wondered (I'm not a C++-er): why does a C++
class X { ... }
statement/construct actually need a terminating semi-colon?There is no real reason. Somebody, somewhere, a long time ago, decided that this will be the syntax, and it stayed to this day ;-)
-
@sierdzio said in Creator: Completion no longer adds closing semicolon:
There is no real reason. Somebody, somewhere, a long time ago, decided that this will be the syntax, and it stayed to this day ;-)
I beg to disagree, @JonB's supposition is perfectly correct.
class { } variable, *pointer;
is a valid and expected (in some cases) construct, albeit somewhat rare. So the semicolon has a well defined meaning and usage.
-
Yes, I wondered whether C++ might allow just that, exactly as
struct
does! As you say, I have never seen that used withclass
! So, since we omitted even a class name after the wordclass
, here we have an anonymous class. Interesting :) -
There's no difference between
struct
andclass
in C++ with the exception of the default access specifier - beingpublic
andprivate
respectively (also extending to default-access inheritance). -
There's no difference between struct and class in C++ with the exception of the default access specifier
Hmm, can I try to challenge this (without lazily just Googling!)?
One problem is that I'm used to C# not C++, C# has
struct
as well asclass
, but does have different semantics, so what I'm thinking of might be C# not C++...IIRC (though I could be shaky!), in C#
struct
must have a constructor with no parameters, even if there is another overload which does take parameters. Not so forclass
. How's that in C++ ? :) In C++,class
can do multiple inheritance, right? Butstruct
s can't multiple inherit, can they? -
@JonB said in Creator: Completion no longer adds closing semicolon:
How's that in C++ ? :)
They're absolutely equivalent:
struct X { X(int, int); };
is the same as:
class X { public: X(int, int); };
And then:
class X : Y { };
is the same as:
class X : private Y { };
as for struct:
struct X : Y { }:
is equivalent to:
struct X : public Y { };
Additionally inheritance can mix
class
andstruct
all the same, it doesn't care about the exact keyword you used, only cares about the access of each member.But structs can't multiple inherit, can they?
Sure they can.
struct A { }; struct B { }; struct C : A, B {};
Is absolutely valid.
-
OK, this is why I like C & C# but not C++ ! I'll stop trying to think of where C++
struct
might differ fromclass
, since you're pretty clear & adamant that they don't :) Thanks. -
@kshegunov said in Creator: Completion no longer adds closing semicolon:
class {
} variable, *pointer;is a valid and expected (in some cases) construct, albeit somewhat rare
Indeed, point taken :-) You are right.
-
@JonB said in Creator: Completion no longer adds closing semicolon:
OK, this is why I like C & C# but not C++ ! I'll stop trying to think of where C++
struct
might differ fromclass
, since you're pretty clear & adamant that they don't :) Thanks.C++ makes perfect sense, if you know it's history. Off the top of my head, I would say that struct came from pure C. When they designed C++, they needed a new construct for 'class', but decided to model it as closely as possible to an already existing construct, 'struct'. They decided that making everything public by default was too dangerous for 'class', but for compatibility reasons, they could not change that behavior for 'struct'.
Today, you can use 'struct' and 'class' to convey different intentions. See http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rc-struct
-
@Asperamanca I think struct is still part of C++ because C should be a subset of C++ (more or less)
-
@jsulm said in Creator: Completion no longer adds closing semicolon:
@Asperamanca I think struct is still part of C++ because C should be a subset of C++ (more or less)
I had no intention of saying "struct is not part of C++", because of course it is.
-
@Asperamanca You misunderstood me: I think struct could be removed from C++ as it is redundant (class is same thing), but then C wouldn't be subset of C++ anymore.
-
@jsulm
Compatibility to legacy code is one of the strengths of C++. I for one would not want to go digging in old but reliably working code, just because a new version of the language stopped supporting certain constructs.When MS did that moving from VB6 to VB.NET, we dropped VB and since use C++ instead.