1

私はこのようなことをしようとしています:

class A {
    void *(*func)(void *);

    A(void *(*function)(void *)){
        func = function;
    }
}

class B {
    void *real_func(void *);
    A ptr;
    B()
    :ptr(&real_func)
    {
        ...
    }
}

しかし、私はこのエラーが発生します:

エラー: ISO C++ では、メンバー関数へのポインターを形成するために、非修飾または括弧付きの非静的メンバー関数のアドレスを取得することを禁止しています。

同じクラスの関数メンバーへの関数ポインターを初期化する方法を誰かが知っていますか???

ありがとう!

カルロス

4

2 に答える 2

0

次のように B を作成できます。

struct B {
    static void *real_func(void *);
    A ptr;
    B()
    :ptr(&real_func)
    {
        ...
    }
};

静的メンバー関数は通常の関数のように機能するため、関数ポインターを作成できます。

通常の関数ポインタが必要ない場合は、std::function を使用できます。

#include <functional>

struct A {
    std::function<void *(void*)> func;

    A(std::function<void *(void*)> function)
    : func(function)
    {
    }
};

struct B {
    void *real_func(void *);
    A ptr;
    B()
    : ptr(std::bind(&B::real_func,this,std::placeholders::_1))
    {
    }
};
于 2013-06-11T03:13:02.720 に答える