From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20610 invoked by alias); 1 Apr 2003 00:26:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 20596 invoked by uid 71); 1 Apr 2003 00:26:01 -0000 Date: Tue, 01 Apr 2003 00:26:00 -0000 Message-ID: <20030401002601.20592.qmail@sources.redhat.com> To: nobody@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: "Darren Reed \(OSE\)" Subject: RE: c++/10273: g++ fails to compile sort() with a template operator that takes a pointer Reply-To: "Darren Reed \(OSE\)" X-SW-Source: 2003-04/txt/msg00001.txt.bz2 List-Id: The following reply was made to PR c++/10273; it has been noted by GNATS. From: "Darren Reed \(OSE\)" To: "Wolfgang Bangerth" Cc: , Subject: RE: c++/10273: g++ fails to compile sort() with a template operator that takes a pointer Date: Tue, 1 Apr 2003 10:10:46 +1000 > > 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 > 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". "/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". "/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". "/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". "/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". "/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". "/tmp/foo.cpp", line 31: Where: Specialized in non-template code. "/tmp/foo.cpp", line 31: Error: The type "std::xLess" is incomplete. "/tmp/foo.cpp", line 14: Error: binary_function is not defined. "/tmp/foo.cpp", line 31: Where: While specializing "std::xLess". "/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". "/tmp/foo.cpp", line 31: Where: Specialized in non-template code. Darren