0

いくつかのメンバー関数を配列にグループ化しました。配列から関数にアクセスするにはどうすればよいですか?「エラーC2064:termは0個の引数を取る関数に評価されません。」下記参照。

class A
{
public:

    //Constructor
    A()
    {
        //Fill function array
        ClipFunction[0] = &A::ClipTop;
        ClipFunction[1] = &A::ClipBottom;
        ClipFunction[2] = &A::ClipLeft;
        ClipFunction[3] = &A::ClipRight;
    }

    //Declare array
    typedef void (A::*ClipFunction_ptr) ();
    ClipFunction_ptr ClipFunction[4];

    //Clipping functions
    void ClipTop();
    void ClipBottom();
    void ClipLeft();
    void ClipRight();

    //Start clipping process
    void StartClip();

};

//Define clipping functions
void A::ClipTop() {}
void A::ClipBottom() {}
void A::ClipLeft() {}
void A::ClipRight() {}

//Define A::StartClip()
void A::StartClip()
{
    //Run through all functions in the array
    for (unsigned int i = 0; i < 4; i++)
    {
        ClipFunction[i](); //ERROR. How do I access ClipFunction[i] ???
    }

}   
4

3 に答える 3

3

次のように関数を逆参照する必要があります。 this->(*ClipFunction[i])();

欠落しているのはthis、コンパイラが、関数に渡す最初のパラメータ(メンバー関数を呼び出すオブジェクトのインスタンス)がないことを訴えていることです。

コンパイラーにとって、メンバー関数は次のとおりです。 void A::ClipFunction() { }

次のようなものに変換されます: void ClipFunction(A* this) { }

したがって、関数がゼロ引数を取る関数ではないというエラーが発生します。

于 2012-11-14T00:27:24.637 に答える
1

問題は、 http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/topic/com.ibm.xlcpp8l.doc/language/ref/cplr034.htmのように「this」を明示的に使用する必要があることだと思います。。

したがって、あなたの場合は、

    (this ->* ClipFunction[i]) ();

それ以外の

    ClipFunction[i]();

PS

この投稿に返信したとき、ViteFalconの回答が見つかりませんでした。基本的に同じことを言っていますが、GCCが私のマシンでエラーを出すので、彼のコード「this->(* ClipFunction [i])()」はコンパイルされないと思います。「(this-> * ClipFunction [i])()」は正しい形式です。

于 2012-11-14T00:40:15.963 に答える
0

::typedefにスコープ解決演算子は必要ないと思います。代わりに入れてみてください

    typedef void (*ClipFunction_ptr) ();
于 2012-11-14T00:30:18.360 に答える