Reputation: 1431
if I declare:
class Avoidance : public Schema<std_msgs::String,prog1::Command>{
and I try to
void*(Schema<std_msgs::String,prog1::Command>::*pt)();
pt=&Avoidance::frontBusy;
compiler report me
error: cannot convert ‘void* (Avoidance::*)()’
to
‘void* (Schema<std_msgs::String_<std::allocator<void> >, prog1::Command_<std::allocator<void> > >::*)()’ in assignment
why? Avoidance inherits from
Schema<std_msgs::String,prog1::Command>
then Avoidance IS Schema<.....>
Upvotes: 2
Views: 191
Reputation: 72271
Getting rid of templates to simplify, suppose you have
class B {
public:
void f();
};
class D : public B {
public:
void g();
};
It might seem a little backwards at first, but you can cast void (B::*)()
to void (D::*)()
, but you cannot cast void (D::*)()
to void (B::*)()
. This makes sense when you think about how they would later be used.
void test() {
void (D::*p)() = &B::f; // OK!
void (B::*q)() = &D::g; // ERROR!
B b;
D d;
(d.*p)(); // Calls B::f on `d`. Okay, `B::f` is an inherited member.
(b.*q)(); // Calls D::g on `b`?? But that's not a member of `b` at all!
}
Upvotes: 2
Reputation: 476990
That's not how member function pointers work. If frontBusy
is a base function, you need to type the pointer appropriately. The dispatch will still work as expected, though!
Here's a basic example:
struct A { virtual void f() = 0; };
struct B : A { virtual void f() { } };
void dispatch(void (A::*pf)(), A & a)
{ // ^^^^^
(a.*pf)();
}
int main()
{
B x;
dispatch(&A::f, x); // calls x.B::f()
} // ^^^^^
So, in your case you want:
void (Schema<std_msgs::String,prog1::Command>::*p)()
= &Schema<std_msgs::String,prog1::Command>::frontBusy;
Upvotes: 3