P: n/a

I have a bunch of templated functions:
template <class Type_t>
double f2(Type_t x) { return 2*x; }
template <class Type_t>
double f3(Type_t x) { return 3*x; }
and a wrapper function, also templated, which I want to take f2 and
f3 as arguments:
template <class Type_t, double (*f)(Type_t)>
double foobar(Type_t x) {
double y=0, z=0;
// compute something complicated from x first,
// the same for all function pointers f.
z = 4*x; // oversimplification here.
// main computation.
y=f(z);
return y;
}
Then,
void some_function(){
double x=5, y=0;
y=foobar<double,f2>(x);
cout << y << endl;
y=foobar<double,f3>(x);
cout << y << endl;
}
works just fine.
The problem is what happens when all these are members of a class:
class A
{
public:
template <class Type_t, double (*f)(Type_t)>
double foobar(Type_t x) {
double y=0, z=0;
// compute something complicated from x first,
// the same for all function pointers f.
z = 4*x; // oversimplification here.
// main computation.
y=f(z);
return y;
}
template <class Type_t>
double f2(Type_t x) { return 2*x; }
template <class Type_t>
double f3(Type_t x) { return 3*x; }
void some_function(){
double x=5, y=0;
y=foobar<double,A::f2>(x);
cout << y << endl;
y=foobar<double,A::f3>(x);
cout << y << endl;
}
};
This doesn't compile. With g++4.0.2 I get these errors:
g++ g Wall o templtemplfunc templtemplfunc.C
templtemplfunc.C: In member function 'void A::some_function()':
templtemplfunc.C:39: error: no matching function for call to 'A::foobar(double&)'
templtemplfunc.C:42: error: no matching function for call to 'A::foobar(double&)'
Compilation exited abnormally with code 1 at Tue Jul 4 13:01:55
How exactly do I call A::foobar() from within A::some_function()?
Is what I want to do possible in the first place?
Thanks!  
Share this Question
P: n/a

Amadeus W. M. wrote:
I have a bunch of templated functions:
template <class Type_t>
double f2(Type_t x) { return 2*x; }
template <class Type_t>
double f3(Type_t x) { return 3*x; }
and a wrapper function, also templated, which I want to take f2 and
f3 as arguments:
template <class Type_t, double (*f)(Type_t)>
double foobar(Type_t x) {
double y=0, z=0;
// compute something complicated from x first,
// the same for all function pointers f.
z = 4*x; // oversimplification here.
// main computation.
y=f(z);
return y;
}
Then,
void some_function(){
double x=5, y=0;
y=foobar<double,f2>(x);
cout << y << endl;
y=foobar<double,f3>(x);
cout << y << endl;
}
works just fine.
The problem is what happens when all these are members of a class:
class A
{
public:
template <class Type_t, double (*f)(Type_t)>
double foobar(Type_t x) {
double y=0, z=0;
// compute something complicated from x first,
// the same for all function pointers f.
z = 4*x; // oversimplification here.
// main computation.
y=f(z);
return y;
}
template <class Type_t>
double f2(Type_t x) { return 2*x; }
template <class Type_t>
double f3(Type_t x) { return 3*x; }
void some_function(){
double x=5, y=0;
y=foobar<double,A::f2>(x);
cout << y << endl;
y=foobar<double,A::f3>(x);
cout << y << endl;
}
};
This doesn't compile. With g++4.0.2 I get these errors:
g++ g Wall o templtemplfunc templtemplfunc.C
templtemplfunc.C: In member function 'void A::some_function()':
templtemplfunc.C:39: error: no matching function for call to 'A::foobar(double&)'
templtemplfunc.C:42: error: no matching function for call to 'A::foobar(double&)'
Compilation exited abnormally with code 1 at Tue Jul 4 13:01:55
How exactly do I call A::foobar() from within A::some_function()?
Is what I want to do possible in the first place?
Thanks!
Member functions wouuldnt work in that manner because member functions
have an inherent "this" paramter and therefore the function signatures
are different from a regular function.
So, you can either make the member function as static and pass the
object as a parameter or else use mem_fn adaptor.  
P: n/a

On Tue, 04 Jul 2006 12:41:00 0700, amparikh wrote:
>
Amadeus W. M. wrote:
>I have a bunch of templated functions:
template <class Type_t> double f2(Type_t x) { return 2*x; }
template <class Type_t> double f3(Type_t x) { return 3*x; } and a wrapper function, also templated, which I want to take f2 and f3 as arguments:
template <class Type_t, double (*f)(Type_t)> double foobar(Type_t x) { double y=0, z=0;
// compute something complicated from x first, // the same for all function pointers f. z = 4*x; // oversimplification here.
// main computation. y=f(z);
return y; }
Then,
void some_function(){ double x=5, y=0;
y=foobar<double,f2>(x); cout << y << endl;
y=foobar<double,f3>(x); cout << y << endl; }
works just fine. The problem is what happens when all these are members of a class:
class A { public:
template <class Type_t, double (*f)(Type_t)> double foobar(Type_t x) { double y=0, z=0;
// compute something complicated from x first, // the same for all function pointers f. z = 4*x; // oversimplification here.
// main computation. y=f(z);
return y; }
template <class Type_t> double f2(Type_t x) { return 2*x; }
template <class Type_t> double f3(Type_t x) { return 3*x; } void some_function(){ double x=5, y=0;
y=foobar<double,A::f2>(x); cout << y << endl;
y=foobar<double,A::f3>(x); cout << y << endl; }
};
This doesn't compile. With g++4.0.2 I get these errors:
g++ g Wall o templtemplfunc templtemplfunc.C templtemplfunc.C: In member function 'void A::some_function()': templtemplfunc.C:39: error: no matching function for call to 'A::foobar(double&)' templtemplfunc.C:42: error: no matching function for call to 'A::foobar(double&)'
Compilation exited abnormally with code 1 at Tue Jul 4 13:01:55
How exactly do I call A::foobar() from within A::some_function()? Is what I want to do possible in the first place?
Thanks!
Member functions wouuldnt work in that manner because member functions
have an inherent "this" paramter and therefore the function signatures
are different from a regular function.
I found that out too. A member function must have an object to be
called upon. To call a member without an object, the member must be static.
So, you can either make the member function as static and pass the
object as a parameter or else use mem_fn adaptor.
I made the f2 and f3 functions in the above example static members, and
all is well, without passing an object as parameter.
Thanks!   This discussion thread is closed Replies have been disabled for this discussion.   Question stats  viewed: 1476
 replies: 2
 date asked: Jul 4 '06
