c++/10273: g++ fails to compile sort() with a template operator that takes a pointer
Darren Reed (OSE)
darrenr@optimation.com.au
Tue Apr 1 00:18:00 GMT 2003
> > Is it unreasonable to ask for a better error message in this case ?
> > Or perhaps better checking of templates ? (This would probably cause
> > a more accurate error message to be output.)
>
> I guess in this case, the error message is as clear as it can be: the
> declaration of the template is legal (you parameterize it on a value, not
> on a type as you had expected) so there is nothing the compiler could have
> told you there. Then you tried to use the template with a type instead of
> the required value and the compiler told you
> x.cc: In function `void std::doit()':
> x.cc:31: type/value mismatch at argument 1 in template parameter list for `
> template<std::ClassName*<anonymous> > struct std::xLess'
> x.cc:31: expected a constant of type `std::ClassName*', got `std::ClassName*'
>
> I think the message says it quite clearly: first the type/value mismatch,
> then in addition that it expected a value and got a type. What more do you
> want?
Ok, so you know how to parse that message better than I do. To me it says
"expected type 'A', got 'A'" (where A is "std::ClassName*") and hence it
does not make any sense to me. I'm the programmer, so because I don't
intend for there to be a value there, I don't see a value there. The error
doesn't tell me that using * implies a value is being used in a template
where a type should be.
Just for the sake of comparison, I tried compiling the same piece of code
with Visual Studio .Net and SUNWspro CC. Both of those compilers (rightly
or wrongly, I don't know) complain about the code when it comes to parsing
the template statement. In my situation, this type of verbosity helps.
d:\Documents and Settings\darrenr\My Documents\Visual Studio Projects\foo\foo2.cpp(17) : error C2504: 'binary_function' : base class
undefined
d:\Documents and Settings\darrenr\My Documents\Visual Studio Projects\foo\foo2.cpp(23) : see reference to class template
instantiation 'std::xLess<>' being compiled
d:\Documents and Settings\darrenr\My Documents\Visual Studio Projects\foo\foo2.cpp(17) : error C2143: syntax error : missing ','
before '<'
d:\Documents and Settings\darrenr\My Documents\Visual Studio Projects\foo\foo2.cpp(34) : error C2065: 'sort' : undeclared identifier
d:\Documents and Settings\darrenr\My Documents\Visual Studio Projects\foo\foo2.cpp(34) : error C2975: 'std::xLess' : invalid
template argument for 'function-parameter', constant expression expected
d:\Documents and Settings\darrenr\My Documents\Visual Studio Projects\foo\foo2.cpp(23) : see declaration of 'std::xLess'
d:\Documents and Settings\darrenr\My Documents\Visual Studio Projects\foo\foo2.cpp(34) : error C2514: 'std::xLess<__formal>' : class
has no constructors
with
[
__formal=0
]
And the compiler from Sun (SUNWspro CC) has this to say:
"/tmp/foo.cpp", line 14: Error: "," expected instead of "*".
"/tmp/foo.cpp", line 14: Error: Expected "class" or "typename" before "*" .
"/tmp/foo.cpp", line 14: Error: binary_function is not defined.
"/tmp/foo.cpp", line 31: Where: While specializing "std::xLess<std::ClassName*>".
"/tmp/foo.cpp", line 31: Where: Specialized in non-template code.
"/tmp/foo.cpp", line 14: Error: "," expected instead of "<".
"/tmp/foo.cpp", line 31: Where: While specializing "std::xLess<std::ClassName*>".
"/tmp/foo.cpp", line 31: Where: Specialized in non-template code.
"/tmp/foo.cpp", line 14: Error: binary_function is not defined.
"/tmp/foo.cpp", line 31: Where: While specializing "std::xLess<std::ClassName*>".
"/tmp/foo.cpp", line 31: Where: Specialized in non-template code.
"/tmp/foo.cpp", line 14: Error: "," expected instead of "<".
"/tmp/foo.cpp", line 31: Where: While specializing "std::xLess<std::ClassName*>".
"/tmp/foo.cpp", line 31: Where: Specialized in non-template code.
"/tmp/foo.cpp", line 14: Error: binary_function is not defined.
"/tmp/foo.cpp", line 31: Where: While specializing "std::xLess<std::ClassName*>".
"/tmp/foo.cpp", line 31: Where: Specialized in non-template code.
"/tmp/foo.cpp", line 14: Error: "," expected instead of "<".
"/tmp/foo.cpp", line 31: Where: While specializing "std::xLess<std::ClassName*>".
"/tmp/foo.cpp", line 31: Where: Specialized in non-template code.
"/tmp/foo.cpp", line 31: Error: The type "std::xLess<std::ClassName*>" is incomplete.
"/tmp/foo.cpp", line 14: Error: binary_function is not defined.
"/tmp/foo.cpp", line 31: Where: While specializing "std::xLess<std::ClassName*>".
"/tmp/foo.cpp", line 31: Where: Specialized in non-template code.
"/tmp/foo.cpp", line 14: Error: "," expected instead of "<".
"/tmp/foo.cpp", line 31: Where: While specializing "std::xLess<std::ClassName*>".
"/tmp/foo.cpp", line 31: Where: Specialized in non-template code.
Darren
More information about the Gcc-bugs
mailing list