Re: new foo::foo() erroneous, ugly, or OK?
usenet@schweikhardt.net wrote:
gcc accepts the following code, while
FlexeLint 8.00u reports an error:
I'll bet that there are lots of cases where FlexLint reports
errors, but g++ accepts the code. The two tools are designed
for different purposes.
$ cat foo.cpp
class foo {
public:
foo() { }
};
int main (void)
{
foo *myfoo = new foo::foo();
delete myfoo;
return 0;
}
---snip---
FlexeLint for C/C++ (Unix) Vers. 8.00u, Copyright
Gimpel Software 1985-2006
--- Module: foo.cpp (C++)
foo *myfoo = new foo::foo();
foo.cpp 8 Error 1018: Expected a type after 'new'
[...]
Well, the error message is odd: you do have a type after new.
But the way you've written the type is strange enough to be
worthy of provoking a comment.
I'm not a C++ expert, so my question to the resident AI is: Is
this in fact an error, or does the C++ standard allow this
syntactically/semantically?
It's clearly legal C++. As would be "new foo::foo::foo:foo()".
The name of a class is inserted into the scope of the class, so
when you write foo::foo, the compiler looks in the class foo,
and finds the class foo. Ad infinitum. In this case, however,
we are dealing with a side effect of class name injection.
Of course the remedy is to remove the "foo::", but
nevertheless, isn't FlexeLint too picky or misleading here?
Given the target for FlexeLint, I wouldn't say too picky, but
the actual message is misleading.
Where on the scale from "erroneous--ugly--unusual--perfectly fine"
is this construct?
Ugly and unusual. Unusual enough to be misleading, in fact.
--
James Kanze GABI Software
Conseils en informatique orient?e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S?mard, 78210 St.-Cyr-l'?cole, France, +33 (0)1 30 23 00 34
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]