если я заявляю:
class Avoidance : public Schema<std_msgs::String,prog1::Command>{
и я пытаюсь
void*(Schema<std_msgs::String,prog1::Command>::*pt)();
pt=&Avoidance::frontBusy;
компилятор сообщи мне
error: cannot convert ‘void* (Avoidance::*)()’
to
‘void* (Schema<std_msgs::String_<std::allocator<void> >, prog1::Command_<std::allocator<void> > >::*)()’ in assignment
Зачем? Избегание наследуется от
Schema<std_msgs::String,prog1::Command>
тогда Avoidance IS Schema<…..>
Избавляемся от шаблонов для упрощения, предположим, у вас есть
class B {
public:
void f();
};
class D : public B {
public:
void g();
};
Сначала это может показаться немного задом наперед, но вы можете разыграть void (B::*)()
в void (D::*)()
, но вы не можете разыграть void (D::*)()
в void (B::*)()
, Это имеет смысл, когда вы думаете о том, как они будут позже использоваться.
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!
}
Это не так, как работают указатели на функции-члены. Если frontBusy
является базовой функцией, вам нужно правильно ввести указатель. отправка все равно будет работать как положено!
Вот основной пример:
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()
} // ^^^^^
Итак, в вашем случае вы хотите:
void (Schema<std_msgs::String,prog1::Command>::*p)()
= &Schema<std_msgs::String,prog1::Command>::frontBusy;