This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: type mismatch when compile 1999 code
On Thu, 2011-06-23 at 08:56 +0200, Axel Freyn wrote:
> Hi Eric,
>
> On Wed, Jun 22, 2011 at 11:05:33PM -0700, eric wrote:
> > Dear gcc programers:
> >
> > I tried to copy (from internet download book's example source code,
> > from
> > http://comscigate.com/BookCode/cppbooks.htm
> > on C++ Primer 3rd Ed, written by Lippman , Lajoie
> > that source code is written before 1999 and I guess is compiled based on
> > borland's compiler
> > I tried to compile/run chap17, text_query.C
> > attach 4 related files(I already modify a little bit, ie replace
> > iostream.h by iostream and add using namespace std;)
> > ------------------
> > eric@eric-laptop:~/CppPrimer3/download/chap17$ g++ Query.C text_query.C
> > In file included from Query.C:1:0:
> > Query.h:27:41: error: type/value mismatch at argument 3 in template
> > parameter list for âtemplate<class _Key, class _Compare, class _Alloc>
> > class std::setâ
> > Query.h:27:41: error: expected a type, got âallocatorâ
> > Query.h:28:36: error: type/value mismatch at argument 2 in template
> > parameter list for âtemplate<class _Tp, class _Alloc> class std::vectorâ
> > Query.h:28:36: error: expected a type, got âallocatorâ
> > ----------
> > this is just first 4 errors of the whole(a lot).
> > /* which I believe is gcc specific(4.5.2), so I decide not post to
> > comp.lang.c++ */
> No, it's a problem in your code. GCC is absolutely right.
>
> GCC states that in Query.h line 27 you're using "allocator" as a template
> parameter. At this position, you would need a type, but "allocator" is
> no type (but nevertheless: allocator is some object/word known to the
> compiler).
>
> The first line in question is the following:
> > const set< short,less<short>,allocator > *solution();
> Due to your "using namespace std;" the word allocator is resolved to the
> standard template "std::allocator" defined in <memory>.
> However, std::allocator is a TEMPLATE, so you have to pass the type of
> variable which you want to allocate:
> > const set< short,less<short>,allocator<short> > *solution();
> allocator<short> IS a type, so gcc will be happy :-)
>
> (and of course you need equivalent changes throughout your code).
>
> On the other hand: if you don't pass a third parameter to std::set, it
> will use by default std::allocator<T> (with T being the appropriate
> type). The same is true for the second template parameter: std::set
> defaults to use std::less<T> for comparisons.
> So, you can just replace this line by
> > const set< short > *solution();
> which will give you the same behaviour.
>
>
> HTH,
>
> Axel
---------------
I tried to add <short> after allocator to become allocator<short>
improve
but still not compile
this is result I get
------------
eric@eric-laptop:~/CppPrimer3/download/chap17$ g++ Query.C UserQuery.C
TextQuery.C text_query.C
In file included from UserQuery.C:1:0:
UserQuery.h:46:68: error: wrong number of template arguments (3, should
be 2)
/usr/local/lib/gcc/i686-pc-linux-gnu/4.5.2/../../../../include/c
++/4.5.2/bits/stl_stack.h:92:11: error: provided for âtemplate<class
_Tp, class _Sequence> class std::stackâ
UserQuery.h:47:68: error: wrong number of template arguments (3, should
be 2)
/usr/local/lib/gcc/i686-pc-linux-gnu/4.5.2/../../../../include/c
++/4.5.2/bits/stl_stack.h:92:11: error: provided for âtemplate<class
_Tp, class _Sequence> class std::stackâ
UserQuery.h: In member function âvoid UserQuery::evalAnd()â:
UserQuery.h:73:28: error: request for member âtopâ in
â((UserQuery*)this)->UserQuery::_query_stackâ, which is of non-class
type âintâ
UserQuery.h:73:48: error: request for member âpopâ in
â((UserQuery*)this)->UserQuery::_query_stackâ, which is of non-class
type âintâ
UserQuery.h:79:14: error: request for member âpushâ in
â((UserQuery*)this)->UserQuery::_current_opâ, which is of non-class type
âintâ
UserQuery.h: In member function âvoid UserQuery::evalOr()â:
UserQuery.h:88:28: error: request for member âtopâ in
â((UserQuery*)this)->UserQuery::_query_stackâ, which is of non-class
type âintâ
UserQuery.h:88:48: error: request for member âpopâ in
â((UserQuery*)this)->UserQuery::_query_stackâ, which is of non-class
type âintâ
UserQuery.h:94:14: error: request for member âpushâ in
â((UserQuery*)this)->UserQuery::_current_opâ, which is of non-class type
âintâ
UserQuery.h: In member function âvoid UserQuery::evalNot()â:
-------------------------------------------------
this is only first couple lines of errors, it still have a lot
is stack(template) is we defined or system(compiler) defined? why it
must need 2 in stead of 3? so should I eliminate last parameter?
and
how about other error?
need any advancer's help and thanks a lot in advance, Eric