member function pointer and STL

Discussion in 'C++' started by Maciej Kwapulinski, Jun 24, 2003.

  1. hallo,
    the following program works OK:
    #include <stdio.h>

    struct A {
    bool fun(int a, int b) {
    return a == b;
    }

    bool (A::*ptr)(int a, int b);
    A() {
    ptr = &A::fun;
    }

    bool fun_ptr(int a, int b) {
    return (A::ptr)(a, b);
    }
    };

    main() {
    A a;
    printf ("%d\n", a.fun_ptr(4,4) );
    printf ("%d\n", a.fun_ptr(4,3) );
    }


    But, after changing into STL class:

    #include <stdio.h>

    template <class T>
    struct A {
    bool fun(T a, T b) {
    return a == b;
    }

    bool (A::*ptr)(T a, T b);
    A() {
    ptr = &A::fun;
    }

    bool fun_ptr(T a, T b) {
    return (A::ptr)(a, b); // this is line 15
    }
    };

    main() {
    A<int> a;
    printf ("%d\n", a.fun_ptr(4,4) );
    printf ("%d\n", a.fun_ptr(4,4) );
    }

    during compilation the following error occures:

    /home/mkwap/BGP-cvs/ccc/p11.cpp: In method `bool
    A<int>::fun_ptr<int>(int, int)':
    /home/mkwap/BGP-cvs/ccc/p11.cpp:21: instantiated from here
    /home/mkwap/BGP-cvs/ccc/p11.cpp:15: pointer-to-member function
    A<int>::ptr cannot be called
    /home/mkwap/BGP-cvs/ccc/p11.cpp:15: without an object; consider
    using .* or ->*

    Do You know what is the problem and what to do to make second
    program run

    Greetings
    Maciej
     
    Maciej Kwapulinski, Jun 24, 2003
    #1
    1. Advertisements

  2. "works OK" is not enough to be correct. It contains at least
    two errors. See below.
    This is incorrect. Needs to be

    return (this->*ptr)(a, b);
    This is incorrect. Needs to be

    int main() {
    What you change your class into is not an "STL class".
    It's a class template.
    return (this->*ptr)(a, b); // this is line 15
    int main() {

    (as you can see both changes are _precisely_ the same as in the
    non-template code)
    It will compile (and hopefully run) just fine if you make the
    changes I mentioned.

    Victor
     
    Victor Bazarov, Jun 24, 2003
    #2
    1. Advertisements

  3. Maciej Kwapulinski wrote in
    It shouldn't (AFAICT).

    Try compiling with all warning/error's on,
    for example -Wall -ansi -pedantic with g++.

    If that doesn't work get a better compiler if you can.
    return (this->*ptr)(a, b);

    This is guess. But I suspect you may think that the 'A::' you
    wrote above is telling the compiler which object to call the ptr
    on. If so it isn't, it's actually telling the compiler to use the
    'ptr' that is in the scope of A and since fun_ptr() is a member
    of A this is the default, IOW it does nothing in this context.

    STL is a TLA that expands to tandard [T]emplate [L]ibrary.

    What you have here is a class template.
    same as before:

    return (this->*ptr)(a, b);
    This error message actually tells you how to fix the error!
    Which is nice, A shame you didn't get it for the first programme.
    HTH

    Rob.
     
    Rob Williscroft, Jun 24, 2003
    #3
    1. Advertisements

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.