Шаблон C ++ и наследование с указателем метода

если я заявляю:

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

2

Решение

Избавляемся от шаблонов для упрощения, предположим, у вас есть

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!
}
2

Другие решения

Это не так, как работают указатели на функции-члены. Если 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;
3

По вопросам рекламы [email protected]