Help Please: Passing Functor Object with Template type parameter

Discussion in 'C++' started by CoolPint, Dec 23, 2003.

  1. CoolPint

    CoolPint Guest

    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);
    };
     
    CoolPint, Dec 23, 2003
    #1
    1. Advertising

  2. CoolPint

    tom_usenet Guest

    On 23 Dec 2003 02:28:51 -0800, (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
     
    tom_usenet, Dec 23, 2003
    #2
    1. Advertising

  3. CoolPint

    CoolPint Guest

    > >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.
     
    CoolPint, Dec 24, 2003
    #3
  4. CoolPint

    tom_usenet Guest

    On 23 Dec 2003 21:06:53 -0800, (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
     
    tom_usenet, Dec 29, 2003
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Chandra Shekhar Kumar

    functor object in template class

    Chandra Shekhar Kumar, Jun 24, 2003, in forum: C++
    Replies:
    5
    Views:
    1,278
    porschberg
    Jun 26, 2003
  2. jack
    Replies:
    3
    Views:
    405
    Victor Bazarov
    Feb 28, 2004
  3. Replies:
    8
    Views:
    406
  4. Gb42

    Template functor, how to hide the type?

    Gb42, Oct 26, 2010, in forum: C Programming
    Replies:
    1
    Views:
    362
  5. Replies:
    14
    Views:
    971
    Christof Warlich
    Jul 19, 2012
Loading...

Share This Page