Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   Help Please: Passing Functor Object with Template type parameter (http://www.velocityreviews.com/forums/t280207-help-please-passing-functor-object-with-template-type-parameter.html)

CoolPint 12-23-2003 10:28 AM

Help Please: Passing Functor Object with Template type parameter
 
I have implemented a generic priority queue below and tested it works
fine, but I have one small problem I cannot understand. I have type
parameter F which determines the priority so that users can
instantiate in the following ways

PQueue<int> pq1;
PQueue<int, Functor> pq2; // where Functor is a name of user-defined
class

I also added another constructor to accept a function pointer so that
users can use normal functions as callback too. For example,

PQueue<int, bool (*) (int, int)> pq3(function);
// where function is a user-defined function which accepts ints and a
bool

So far so good. I then got a bit curious and issued something like
this:

PQueue<int, Functor> pq4(Functor()); <------- This causes the error

thinking this would assign Functor class to F and then assign an
object of Functor class to cmp, but it got me a compiler error which I
cannot understand.
I am interested to know what the error message means and what is
causing the problem. Can somebody kindly explain what is happening?

The compiler error I got when I tried to compile above with g++ is
something like below:

pqdriver.cpp:23: request for member `enQueue' in `numq(isGreater
(*)())', which
is of non-aggregate type `PQueue<int, isGreater> ()(isGreater
(*)())'

I would very much appreciate a kind explanation as to what the problem
is what is causing it. And maybe a solution,, but I am more interested
in knowing what's happening so that I can learn from it. Thanks a lot
in advance!

class DefaultHeapOrder {
public:
template <typename T>
bool operator()(const T & a, const T & b)
{ return ( a < b ? true : false); }
};

template <typename T, typename F = DefaultHeapOrder >
class PQueue {
public:
PQueue();
explicit PQueue(F);
template <typename Iterator>
PQueue(Iterator, Iterator);
bool isEmpty() const;
bool isFull() const;
bool enQueue(const T &);
bool deQueue(T &);
bool getTop(T &);
void clear();
private:
int counter;
DArray<T> heap;
F cmp;
void buildHeap();
void shiftdown(int);
};

tom_usenet 12-23-2003 11:48 AM

Re: Help Please: Passing Functor Object with Template type parameter
 
On 23 Dec 2003 02:28:51 -0800, coolpint@yahoo.co.uk (CoolPint) wrote:

>I have implemented a generic priority queue below and tested it works
>fine, but I have one small problem I cannot understand. I have type
>parameter F which determines the priority so that users can
>instantiate in the following ways
>
>PQueue<int> pq1;
>PQueue<int, Functor> pq2; // where Functor is a name of user-defined
>class
>
>I also added another constructor to accept a function pointer so that
>users can use normal functions as callback too. For example,
>
>PQueue<int, bool (*) (int, int)> pq3(function);
>// where function is a user-defined function which accepts ints and a
>bool
>
>So far so good. I then got a bit curious and issued something like
>this:
>
>PQueue<int, Functor> pq4(Functor()); <------- This causes the error


That's a function declaration! (a function called pq4 taking a Functor
and returning a PQueue<int, Functor>). I think you meant:

//extra parentheses prevent parsing as function decl
PQueue<int, Functor> pq4((Functor()));

or
// named object also works.
Functor f;
PQueue<int, Functor> pq4(f);

Tom

C++ FAQ: http://www.parashift.com/c++-faq-lite/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html

CoolPint 12-24-2003 05:06 AM

Re: Help Please: Passing Functor Object with Template type parameter
 
> >PQueue<int, Functor> pq4(Functor()); <------- This causes the error
>
> That's a function declaration! (a function called pq4 taking a Functor
> and returning a PQueue<int, Functor>). I think you meant:


That's why! Thanks! How silly can I get? Now you mention it, it indeed
looks
like a function prototype...

> //extra parentheses prevent parsing as function decl
> PQueue<int, Functor> pq4((Functor()));


I am afraid this still gives me an error. g++ says

pqdriver.cpp:21: parse error before `)' token

I again feel stupid not to be able to see what makes the compiler
complain. Would you kindly help me out one more time?

> or
> // named object also works.
> Functor f;
> PQueue<int, Functor> pq4(f);


Yes, this works and of course it should....

Thank you, Tom... I think you helped me last time too. This group is
turning out to be a very valuable place for learning experience.
Thanks.

tom_usenet 12-29-2003 03:25 PM

Re: Help Please: Passing Functor Object with Template type parameter
 
On 23 Dec 2003 21:06:53 -0800, coolpint@yahoo.co.uk (CoolPint) wrote:

>> >PQueue<int, Functor> pq4(Functor()); <------- This causes the error

>>
>> That's a function declaration! (a function called pq4 taking a Functor
>> and returning a PQueue<int, Functor>). I think you meant:

>
>That's why! Thanks! How silly can I get? Now you mention it, it indeed
>looks
>like a function prototype...
>
>> //extra parentheses prevent parsing as function decl
>> PQueue<int, Functor> pq4((Functor()));

>
>I am afraid this still gives me an error. g++ says
>
>pqdriver.cpp:21: parse error before `)' token
>
>I again feel stupid not to be able to see what makes the compiler
>complain. Would you kindly help me out one more time?


(Delayed by xmas!)

That's a gcc bug. I reported it a while back, and I think it is marked
as closed for gcc 3.4 (due soon?), which includes a brand new
hand-coded parser.

Tom

C++ FAQ: http://www.parashift.com/c++-faq-lite/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html


All times are GMT. The time now is 08:37 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.