- **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*)

Help Please: Passing Functor Object with Template type parameterI 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); }; |

Re: Help Please: Passing Functor Object with Template type parameterOn 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 |

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. |

Re: Help Please: Passing Functor Object with Template type parameterOn 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.