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

  2. "Maciej Kwapulinski" <> wrote...
    > hallo,
    > the following program works OK:


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

    > #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);


    This is incorrect. Needs to be

    return (this->*ptr)(a, b);

    > }
    > };
    >
    > main() {


    This is incorrect. Needs to be

    int 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:


    What you change your class into is not an "STL class".
    It's a class template.

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


    return (this->*ptr)(a, b); // this is line 15

    > }
    > };
    >
    > main() {


    int main() {

    (as you can see both changes are _precisely_ the same as in the
    non-template code)

    > 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


    It will compile (and hopefully run) just fine if you make the
    changes I mentioned.

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

  3. Maciej Kwapulinski wrote in news::

    > hallo,
    > the following program works OK:


    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.

    > #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);


    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.


    > }
    > };
    >
    > 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:


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

    What you have here is a class template.

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


    same as before:

    return (this->*ptr)(a, b);

    > }
    > };
    >
    > 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 ->*
    >


    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.

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


    HTH

    Rob.
    --
    http://www.victim-prime.dsl.pipex.com/
    Rob Williscroft, Jun 24, 2003
    #3
    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. Newsgroup - Ann
    Replies:
    5
    Views:
    593
    John Carson
    Jul 30, 2003
  2. glen stark
    Replies:
    2
    Views:
    689
    Ron Natalie
    Oct 10, 2003
  3. Fraser Ross
    Replies:
    4
    Views:
    1,026
    Fraser Ross
    Aug 14, 2004
  4. Stephen Howe
    Replies:
    2
    Views:
    280
    Stephen Howe
    Nov 6, 2012
  5. somenath
    Replies:
    2
    Views:
    149
    somenath
    Aug 29, 2013
Loading...

Share This Page