C++ C++;注册回调时无法将基类转换为派生类
我想创建一个回调到同一层次结构的不同对象的映射,但我得到以下错误:C++ C++;注册回调时无法将基类转换为派生类,c++,stl,callback,C++,Stl,Callback,我想创建一个回调到同一层次结构的不同对象的映射,但我得到以下错误: class ResponseBase { public: virtual bool Parse() = 0; }; class MyResponse : public ResponseBase { public: bool Parse() { return true; } void SayHello() {} }; typedef std::tr1::function<void (Respons
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;
}
类响应库
{
公众:
虚拟布尔解析()=0;
};
类MyResponse:公共响应数据库
{
公众:
bool Parse(){return true;}
void SayHello(){}
};
typedef std::tr1::函数MYCALLBACK;
typedef std::map MYCALLBACKS;
我的回调我的回调;
无效注册表回调(int-nType,MYCALLBACK-MYCALLBACK)
{
MYCALLBACKS::迭代器iter=MYCALLBACKS.find(nType);
if(iter==myCallbacks.end())
myCallbacks[nType]=myCallback;
其他的
iter->second=myCallback;
}
void Callback0(ResponseBase*pResponseBase){}
无效回调1(MyResponse*pMyResponse){}
int main()
{
RegisterCallback(0,Callback0);//确定
RegisterCallback(1,Callback1);//错误C2664:'void(MyResponse*)':无法将参数1从'ResponseBase*'转换为'MyResponse*'
返回0;
}
但我不想做这样的事情:
void Callback1(ResponseBase *pResponseBase)
{
MyResponse *p = static_cast<MyResponse*>(pResponseBase);
p->SayHello();
}
void回调1(ResponseBase*pResponseBase)
{
MyResponse*p=静态施法(前置基);
p->SayHello();
}
如何解决此错误?如果您只是在对象中调用虚拟方法,那么您不需要对每个继承的类进行不同的回调。为什么还要强制转换?如果类型是多态的,则不需要这样做。问题是,编译器如何知道您以后不会尝试使用非
MyResponse
实例的东西调用Callback1
?它怎么知道要尝试并强制转换它呢?听起来像是要存储一组对不同对象类型的回调。您需要存储一个包含不透明对象引用(通常称为委托)的回调对象。请参见以下示例:@willj谢谢,但是有没有其他不涉及模板的方法?