Шаблон 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!
}

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