【发布时间】:2016-08-17 19:36:44
【问题描述】:
在编译std::static_pointer_cast<>() 时抛出以下错误,我无法找到解决方法:
error: invalid static_cast from type ecse::EventSubscriptionManager<ecse::BaseEvent>* to type ecse::EventSubscriptionManager<TestEvent>*
我有以下层次结构。最后,它们将被 POD 类型的成员填充,并且很可能会变成结构。
class BaseEvent {};
template <class E>
class Event : public BaseEvent, public Type<E> {};
class TestEvent : public Event<TestEvent> {};
我目前正在处理 EventManager 的订阅功能部分,但是在编译时我收到了上面发布的错误。注意:E::ID()在类中定义为Type,用于标识类类型。
template <class E>
class EventSubscriptionManager
{
public:
void Subscribe(std::function<void(E)> fptr);
private:
std::function<void(E)> event_function_;
};
class EventManager
{
public:
template <class E>
void Subscribe(std::function<void(E)> fptr)
{
std::shared_ptr<EventSubscriptionManager<E>> sub_manager_ptr;
auto sub_manager_iterator = sub_managers_.find(E::ID());
if(sub_manager_iterator == sub_managers_.end())
{
sub_manager_ptr = std::make_shared<EventSubscriptionManager<E>>();
}
else
{
sub_manager_ptr = std::static_pointer_cast<EventSubscriptionManager<E>>(sub_manager_iterator->second);
}
// Continue function...
}
private:
std::unordered_map<std::size_t, std::shared_ptr<EventSubscriptionManager<BaseEvent>>> sub_managers_;
}
我认为问题在于TestEvent 和BaseEvent 之间存在Event<E> 模板类,TestEvent 继承Event<TestEvent> 而不是BaseEvent。这是真的?如果是这样,我如何设置我的层次结构以允许这种类型的转换?
如果不是这样,上面的静态转换有什么问题?
【问题讨论】:
标签: c++ templates c++11 inheritance