0

次の単純なコードを考えます。

namespace exercise {

class A {
public:

    virtual void a() = 0;
    virtual void b() = 0;
    virtual void c() = 0;

};

class B : public A {

    void a() { std::cout << "a function @ B class"; }
    void b() { std::cout << "b function @ B class"; }
    void c() { std::cout << "c function @ B class"; }

};

class C : public A {

    void a() { std::cout << "a function @ C class"; }
    void b() { std::cout << "b function @ C class"; }
    void c() { std::cout << "c function @ C class"; }
};

using Pstd_mem = void(A::*)();

void foo(A* basePointer, Pstd_mem action) {

    basePointer->*action();

}
}

int main(void) {

using namespace exercise;

A* b = new B();
A* c = new C();

foo(b, &A::b);

}

関数 foo を使用してメンバー関数へのポインターを介して関数 B() を呼び出そうとしていますが、コンパイラーは次の行でエラーを出します:

basePointer->*action();

私は何を間違っていますか?

ありがとう

4

1 に答える 1

9

GCC 4.8.1 のエラーは一目瞭然です。

エラー: ' を使用する必要があります。'アクション (...)' でメンバーへのポインタ関数を呼び出す場合は ' または '-> '、たとえば '(... ->* action) (...)' </p>

basePointer->*action();

だから、それをするだけです:

(basePointer->*action)();
于 2013-08-16T06:26:06.870 に答える