0

GuiObject クラスから派生した GUI オブジェクトが Serialiser と Deserialiser を登録できるシステムをセットアップしようとしています。これにより、クラス エイリアスのみに基づいて XML ファイルとの間でシリアライズ/デシリアライズできます。例えば:

class Button : public GuiObject
{
    // ...
};

ButtonXML では次のようになります。

<button>
    [...]
</button>

GuiObjectしたがって、クライアントコードは、オブジェクトのプレースホルダーを使用して派生物に対してシリアライザーとデシリアライザーを登録し、関数を呼び出すことができます。

typedef boost::function<void(ticpp::Element*)> serialisation_function;

// ...

serialisation_function serialiserFunc(boost::bind(&Button::WriteElement, _1, _2));
GuiObjectXmlSerialiser buttonSerialiser("button", serialiserFunc);
guiObjectXmlFactory.registerSerialiser(buttonSerialiser);

Button::WriteElement次のようになります。

virtual void WriteElement(ticpp::Element* element) const;

GuiObjectXmlSerialiser.h:

typedef boost::function<void(ticpp::Element*)> serialisation_function;

// Serialises a GuiObject via a creation and serialisation function, storing
// a class name to differentiate it between others.
class GuiObjectXmlSerialiser
{
public:
    GuiObjectXmlSerialiser(const std::string& class_alias,
        serialisation_function serialisation_func);

    void serialise(gui_object_ptr object, ticpp::Element* element);
private:
    std::string class_alias;
    serialisation_function serialisation_func;
};

GuiObjectXmlSerialiser.cpp:

GuiObjectXmlSerialiser::GuiObjectXmlSerialiser(const std::string& class_alias,
serialisation_function serialisation_func)
: class_alias(class_alias)
, serialisation_func(serialisation_func)
{
}

void GuiObjectXmlSerialiser::serialise(gui_object_ptr object, ticpp::Element* element)
{
    serialisation_func(object, element);
}

serialisation_func(object, element);現在、次の行でこのエラーが発生しています。

error C2064: term does not evaluate to a function taking 2 arguments

そのため、関数を呼び出すと同時に使用するオブジェクトを指定して、メンバー関数を呼び出すためにオブジェクトを渡すのを遅らせる方法を知りたいです。私はこれをしばらく見つめていましたが、役に立ちませんでした。

乾杯。

4

2 に答える 2

0

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

最初に、単一の引数を取る関数を定義しますが、2つの引数を使用してそれを呼び出そうとします。

// Single argument of type ticpp::Element*
typedef boost::function<void(ticpp::Element*)> serialisation_function;
// Call with two arguments:
serialisation_func(object, element); 

// You probably meant:
typedef boost::function<void(gui_object_ptr, ticpp::Element*)> serialisation_function;

次に、関数がメンバー関数であることを考慮していません。つまり、実際には3番目のパラメーターthis(最初の位置)を使用しているということです。これがメンバー関数かどうかを確認する必要がありますが、理解に誤りがあると思います。

// From your code I am not sure what [serial_instance] should be.
serialisation_function serialiserFunc(boost::bind(&Button::WriteElement, [serial_instance] , _1, _2));
于 2012-02-20T10:12:53.630 に答える
0

クラスオブジェクトのコピーを指定する必要があります。バインディングを呼び出すには、次のようにします。

Button* btn = new Button();
serialisation_function serialiserFunc(boost::bind(&Button::WriteElement, btn, _1, _2));

thisこのクラス オブジェクト コピーのバインディングを作成する場合は、ポインタを使用することもできます

于 2012-02-20T10:10:17.523 に答える