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 に答える