10

理解できないコンパイルエラー(MS VS 2008)が発生します。何時間もそれをいじった後、それはすべてぼやけており、私が見逃している非常に明白な(そして非常に愚かな)何かがあるように感じます。重要なコードは次のとおりです。

typedef int (C::*PFN)(int);

struct MAP_ENTRY
    {
    int id;
    PFN pfn;
    };

class C
    {
    ...
    int Dispatch(int, int);
    MAP_ENTRY *pMap;
    ...
    };

int C::Dispatch(int id, int val)
    {
    for (MAP_ENTRY *p = pMap; p->id != 0; ++p)
        {
        if (p->id == id)
            return p->pfn(val);  // <--- error here
        }
    return 0;
    }

コンパイラーは矢印で「項は1つの引数を取る関数に評価されない」と主張しています。なぜだめですか?PFNは、1つの引数を取る関数としてプロトタイプ化され、MAP_ENTRY.pfnはPFNです。ここで何が欠けていますか?

4

4 に答える 4

17

p->pfnメンバー関数へのポインター型のポインターです。このようなポインターを介して関数を呼び出すには、演算子->*または演算子.*のいずれかを使用し、型のオブジェクトをC左オペランドとして指定する必要があります。あなたはしませんでした。

ここでどのタイプのオブジェクトCが使用されることになっているのかわかりません-あなただけがそれを知っています-しかし、あなたの例で *this. その場合、呼び出しは次のようになります

(this->*p->pfn)(val)

少し複雑に見えないようにするために、中間変数を導入できます

PFN pfn = p->pfn;
(this->*pfn)(val);
于 2009-12-18T14:26:24.990 に答える
8

試す

return (this->*p->pfn)(val);
于 2009-12-18T14:17:27.050 に答える
1

私自身の経験を取り入れるために、次のステートメントが原因でg++でエラーが発生しました。

  (this -> *stateHandler)() ;

ここで、stateHandlerは、*thisによって参照されるクラスのvoidメンバー関数へのポインターです。この問題は、矢印演算子の間のスペースが原因で発生しました。次のスニペットは正常にコンパイルされます。

(this->*stateHandler)() ;

私はg++(GCC)4.4.2 20090825(プレリリース)を使用しています。FWIW。

于 2010-09-01T16:55:47.750 に答える
-1

p->pfnは関数ポインタです。それを機能させるには*を使用する必要があります。への変更

(*(p->pfn))(val)
于 2009-12-18T14:20:46.840 に答える