0

同じ階層の異なるオブジェクトへのコールバックのマップを作成したいのですが、次のエラーが発生します。

class ResponseBase
{
public:
    virtual bool Parse() = 0;
};

class MyResponse : public ResponseBase
{
public:
    bool Parse() { return true; }
    void SayHello() {}
};

typedef std::tr1::function<void (ResponseBase*)> MYCALLBACK;
typedef std::map<int, MYCALLBACK> MYCALLBACKS;

MYCALLBACKS myCallbacks;

void RegisterCallback(int nType, MYCALLBACK myCallback)
{
    MYCALLBACKS::iterator iter = myCallbacks.find(nType);
    if (iter == myCallbacks.end())
        myCallbacks[nType] = myCallback;
    else
        iter->second = myCallback;
}

void Callback0(ResponseBase *pResponseBase) {}
void Callback1(MyResponse *pMyResponse) {}

int main()
{
    RegisterCallback(0, Callback0); // OK
    RegisterCallback(1, Callback1); // error C2664: 'void (MyResponse *)' : cannot convert parameter 1 from 'ResponseBase *' to 'MyResponse *'

    return 0;
}

ただし、次のようなことは避けたいと思います。

void Callback1(ResponseBase *pResponseBase)
{
    MyResponse *p = static_cast<MyResponse*>(pResponseBase);
    p->SayHello();
}

エラーを回避するにはどうすればよいですか?

4

0 に答える 0