2

如果我声明:

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>

然后避免是模式<.....>

4

2 回答 2

3

这不是成员函数指针的工作方式。如果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;
于 2013-01-18T15:16:05.573 回答
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!
}
于 2013-01-18T15:20:50.383 回答