Je sais que la réponse standard pour une erreur de lien sur typeinfo manquant implique également vtable et une fonction virtuelle que j'ai oublié de définir réellement.g ++ erreur de lien - typeinfo, mais pas vtable
Je suis assez certain que ce n'est pas la situation cette fois-ci.
est ici l'erreur:
UI.o: En fonction boost::shared_ptr<Graphics::Widgets::WidgetSet>::shared_ptr<Graphics::Resource::GroupByState>(boost::shared_ptr<Graphics::Resource::GroupByState> const&, boost::detail::dynamic_cast_tag)': UI.cpp:(.text._ZN5boost10shared_ptrIN8Graphics7Widgets9WidgetSetEEC1INS1_8Resource12GroupByStateEEERKNS0_IT_EENS_6detail16dynamic_cast_tagE[boost::shared_ptr<Graphics::Widgets::WidgetSet>::shared_ptr<Graphics::Resource::GroupByState>(boost::shared_ptr<Graphics::Resource::GroupByState> const&, boost::detail::dynamic_cast_tag)]+0x30): undefined reference to
typeinfo pour des graphiques Widgets :: widgetset »
Exécution C++ filt sur le nom mutilée odieux montre qu'il est en fait à la recherche .Améliorez :: shared_ptr :: shared_ptr (boost :: shared_ptr const &, boost :: détail :: dynamic_cast_tag)
La hiérarchie d'héritage ressemble à quelque chose comme
class AbstractGroup
{
public:
virtual ~AbstractGroup();
typedef boost::shared_ptr<AbstractGroup> Ptr;
...
};
class WidgetSet : public AbstractGroup
{
public:
virtual ~WidgetSet();
typedef boost::shared_ptr<WidgetSet> Ptr;
...
};
class GroupByState : public AbstractGroup
{
public:
virtual ~GroupByState();
...
};
Ensuite, il y a ceci:
class UI : public GroupByState
{
public:
virtual ~UI();
...
void LoadWidgets(GroupByState::Ptr resource);
...
};
Ensuite, la mise en œuvre originale:
void UI::LoadWidgets(GroupByState::Ptr resource)
{
WidgetSet::Ptr tmp(boost::dynamic_pointer_cast<WidgetSet>(resource));
if(tmp)
{
...
}
}
erreur stupide de ma part (tente de jeter à une classe de frères et soeurs avec un parent commun), même si l'erreur est un peu de cryptique.
Changing à ceci:
void UI::LoadWidgets(AbstractGroup::Ptr resource)
{
WidgetSet::Ptr tmp(boost::dynamic_pointer_cast<WidgetSet>(resource));
if(tmp)
{
...
}
}
(que je suis assez sûr est ce que je voulais dire à faire) m'a laissé avec une erreur très similaire:
UI.o: En fonction boost::shared_ptr<Graphics::Widgets::WidgetSet>::shared_ptr<Graphics::_Drawer::Group>(boost::shared_ptr<Graphics::_Drawer::Group> const&, boost::detail::dynamic_cast_tag)': UI.cpp:(.text._ZN5boost10shared_ptrIN8Graphics7Widgets9WidgetSetEEC1INS1_7_Drawer5GroupEEERKNS0_IT_EENS_6detail16dynamic_cast_tagE[boost::shared_ptr<Graphics::Widgets::WidgetSet>::shared_ptr<Graphics::_Drawer::Group>(boost::shared_ptr<Graphics::_Drawer::Group> const&, boost::detail::dynamic_cast_tag)]+0x30): undefined reference to
typeinfo pour Graphics :: Widgets :: WidgetSet ' collect2: ld a renvoyé 1 statut de sortie
dynamic_cast_tag est juste une structure vide dans boost/shared_ptr.hpp. C'est juste une supposition que boost pourrait avoir quelque chose à voir avec l'erreur. Passer dans un WidgetSet :: Ptr élimine totalement le besoin d'un cast, et il se construit bien (c'est pourquoi je pense qu'il y a plus de choses que la réponse standard pour cette question).
De toute évidence, je supprime beaucoup de détails qui pourraient être importants. Ma prochaine étape est de réduire au plus petit exemple qui ne parvient pas à construire, mais je me suis dit que j'essaierais la sortie paresseux et de prendre d'abord le coup ici.
TIA!
EDIT: Voir quelques détails que les gens ont formulé des observations au sujet
ajouter à la réponse de @Drew Hall ci-dessous.dynamic_cast a besoin de RTTI qui est stocké dans vftable mais comme vous n'avez aucune méthode virtuelle, il n'y a pas de place pour stocker. –
Perharps vous devriez demander une prime. – Alerty