1
#define UCHAR unsigned char

typedef bool (*FUNC)(UCHAR uc1, UCHAR uc2);
typedef void(*PF)(FUNC, UCHAR*);
PF    Assign;

class Class  {
    private:
       UCHAR buf[32];
       bool func(UCHAR c1, UCHAR c2)  { }

    public:
       Class::Class(void)  {
          Assign( func, buf );         // <<< Microsoft VC++ error C3867
       }

       Class::~Class()  { }
};

エラー C3867: 'Class::func': 関数呼び出しに引数リストがありません。'&Class::func' を使用してメンバーへのポインターを作成する

上記のエラーメッセージの提案を試してみると

Assign( &Class::func, buf ); // <<< Microsoft VC++ エラー C2664

次のエラーが表示されます。

エラー C2664: 'void (FUNC,unsigned char *)': パラメーター 1 を 'bool (__thiscall Class::* )(unsigned char,unsigned char)' から 'FUNC' に変換できません この変換が可能なコンテキストはありません

他に何も変更せずに、この Assign() 関数をコンパイルするにはどうすればよいですか? これらの typedef は、インターフェイスする必要があるライブラリからのものです。

4

2 に答える 2

1

タイプエイリアスFUNCとはメンバー関数ポインターではなく、静的メンバー関数PFを指すためにのみ使用できます。その理由は、すべての非静的メンバー関数には、ポインターの暗黙の最初の引数があるためです。this

ジェネリック関数の「ポインタ」が必要な場合は、以下を調べる必要がありますstd::function

typedef std::function<bool(UCHAR uc1, UCHAR uc2)> FUNC;
typedef std::function<void(FUNC, UCHAR*)> PF;
PF    Assign;

Class::Class(void)  {
    Assign( std::bind(&Class::func, *this), buf );
}
于 2013-01-24T12:38:25.590 に答える
1

funcは非静的メンバー関数であるため、その型はbool (Class::*)(UCHAR, UCHAR), while Assignrequiresbool (*)(UCHAR, UCHAR)です。非静的メンバー関数を非メンバー関数に変換することはできません。

に渡すことができるようにするにfuncは、静的Assignにする必要があります。func

于 2013-01-24T12:36:56.070 に答える