std::dynamic_pointer_cast isn't casting correctly downwards
发布代码后遇到一个问题,我将予以解释:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | template <class T> std::shared_ptr< T > getWidget(const std::string& id) { auto iter = findObject(id); if (iter != m_widgets.end()) return std::dynamic_pointer_cast< T >(*iter); return nullptr; } const Widget::Ptr getType(const std::string& id) { auto iter = findObject(id); if (iter != m_widgets.end()) { if ((*iter)->getWidgetType() =="Label") return std::dynamic_pointer_cast<Label>(*iter); else if ((*iter)->getWidgetType() =="Editbox") return std::dynamic_pointer_cast<EditBox>(*iter); else if ((*iter)->getWidgetType() =="ButtonLabel") return std::dynamic_pointer_cast<ButtonLabel>(*iter); else if ((*iter)->getWidgetType() =="Menu") return std::dynamic_pointer_cast<Menu>(*iter); } } auto type = SceneManager::getCurrentScene().m_gui.getType(widgetId); SceneManager::getCurrentScene().m_gui.getWidget<decltype(type)>(widgetId)->attachToMenu(getId()); |
error: 'class std::shared_ptr' has no member named 'attachToMenu'|
显然,这意味着它无法正确投射并且正在返回Widget。 任何帮助将是巨大的,谢谢!
" Widget :: Ptr只是typedef std :: shared_ptr。"
我假设它是
1 2 | auto type = SceneManager::getCurrentScene().m_gui.getType(widgetId); // type is std::shared_ptr<Widget>, that is, a pointer to base type |
此外,使用
最终,垂头丧气通常表示设计不良。 我相信可以通过在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Widget { public: virtual ~Widget() = default; virtual void attachToMenu(const std::string& id) = 0; }; class EditBox : public Widget { public: virtual void attachToMenu(const std::string& id) override { // do the stuff } }; std::shared_ptr<Widget> widget = std::make_shared<EditBox>(); widget->attachToMenu(getId()); // calls EditBox::attachToMenu |
当你声明
1 | auto type = ... |