5

少し前にこの問題があり、あきらめましたが、最近戻ってきました。

#include <iostream>

class element2D;

class node2D
{
public:
    void (element2D::*FunctionPtr)();
    void otherMethod()
    { std::cout << "hello" << std::endl;
        ((this)->*(this->FunctionPtr))(); //ERROR<-------------------
    }

};

class element2D
{
public:
    node2D myNode;
    void doSomething(){ std::cout << "do something" << std::endl; }
};

int main()
{
    element2D myElement;

    myElement.myNode.FunctionPtr = &element2D::doSomething; //OK
    ((myElement).*(myElement.myNode.FunctionPtr))();        //OK

    return 0;
}

マークされた行でエラーが発生します:

pointer to member type 'void (element2D::)()' incompatible with object type 'node2D'

助けてくれて本当にありがとう。今日、部分的に私を助けた同様の質問がありました: link . しかし、それは私の問題に対する完全な答えではないようです。

実際には、これら 2 つの問題の違いは 1 つだけです。それは、関数が呼び出される場所です。

御時間ありがとうございます

4

2 に答える 2

5

「this」は node2D へのポインターですが、FunctionPtr は element2D のメンバーを参照しています。これがエラーです。

#if 0 // 壊れたバージョン

void otherMethod()
{ std::cout << "hello" << std::endl;
    ((this)->*(this->FunctionPtr))(); //ERROR<-------------------
}

#else // 修正版

void otherMethod( element2D * that )
{ std::cout << "hello" << std::endl;
    ((that)->*(this->FunctionPtr))();
}

#endif

次に、次のように呼び出します。

myElement.myNode.otherMethod( &myElement );

これを改善するためにできることはありますが、これで始められるはずです。

于 2010-03-03T23:52:16.623 に答える
0

element2D メンバーへのポインターを呼び出す場合は、element2D オブジェクトへのポインターが必要です。必要な機能に Boost.Function または Boost.Signals2 を使用することを検討してください。

于 2010-03-03T23:38:14.760 に答える