member function pointer and STL

M

Maciej Kwapulinski

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
 
V

Victor Bazarov

Maciej Kwapulinski said:
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
 
R

Rob Williscroft

Maciej Kwapulinski wrote in
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.
 

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. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,756
Messages
2,569,533
Members
45,007
Latest member
OrderFitnessKetoCapsules

Latest Threads

Top