如果我有一个带有子类SetConfigurationData的基类MessageWrapper,为什么绑定子类参数不起作用?
它不应该以多态方式工作吗?
Class MessageHandler
{
public:
void RegisterHandler(std::function<void(MessageWrapper &)> callback_)
{}
};
class Testing
{
public:
Testing(MessageHandler &handler_)
: m_Handler(handler_)
{
m_Handler.RegisterHandler(std::bind(&Testing::TestMessageHandler, this, std::placeholders::_1));
}
void TestMessageHandler(SetConfigurationData &msg_)
{}
MessageHandler m_Handler;
};
我收到错误: “无法专门化功能模板'unkown-type std :: invoke( Callable &amp;&amp;,Types&amp;&amp; ...)'
如果我这样做,它会起作用:
void TestMessageHandler(MessageWrapper &msg_)
{}
答案 0 :(得分:2)
多态性不能像这样工作。我将用一个例子来解释。让我们说一下这个功能。
void TestMessageHandler(SetConfigurationData &msg_)
具有特定于其身体中的子对象的东西。说
msg.child_method()
现在,由于RegisterHandler callback_()将基类作为参数,它应该如何处理这个&#34; msg.child_method()&#34;打电话,因为它不是基类方法?
现在,如果我们反过来这样做会发生什么。以下作品。
class MessageWrapper
{
};
class SetConfigurationData : public MessageWrapper
{
public:
void RegisterHandler(std::function<void(SetConfigurationData&)> callback_)
{}
};
class MessageHandler
{
};
class Testing
{
public:
Testing(SetConfigurationData &handler_)
: m_Handler(handler_)
{
m_Handler.RegisterHandler(std::bind(&Testing::TestMessageHandler, this, std::placeholders::_1));
}
void TestMessageHandler(MessageWrapper &msg_)
{}
SetConfigurationData m_Handler;
};
即使TestMessageHandler将MessageWrapper作为参数,你也可以将它绑定到callback_,它将Child类(SetConfigurationData)作为参数。