簡體   English   中英

g ++鏈接器錯誤--typeinfo,但不是vtable

[英]g++ linker error--typeinfo, but not vtable

我知道有關缺少typeinfo的鏈接器錯誤的標准答案通常還涉及vtable和我忘記實際定義的一些虛函數。

我相當確定這次不是這種情況。

這是錯誤:

UI.o:在函數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對Graphics :: Widgets :: WidgetSet'的typeinfo的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

在令人討厭的變形名稱上運行c ++ filt表明它實際上正在查看.boost :: shared_ptr :: shared_ptr(boost :: shared_ptr const&,boost :: detail :: dynamic_cast_tag)

繼承層次結構看起來像

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();
       ...
};

然后是這樣的:

class UI : public GroupByState
{
    public:
       virtual ~UI();
       ...
       void LoadWidgets( GroupByState::Ptr resource );
       ...
};

然后是原始實現:

void UI::LoadWidgets( GroupByState::Ptr resource )
{
   WidgetSet::Ptr tmp( boost::dynamic_pointer_cast< WidgetSet >(resource) );
   if( tmp )
   {
       ...
   }
}

就我而言,這是愚蠢的錯誤(試圖將其轉換為具有共享父級的同級類),即使該錯誤是一種神秘的錯誤也是如此。

更改為此:

void UI::LoadWidgets( AbstractGroup::Ptr resource )
{
   WidgetSet::Ptr tmp( boost::dynamic_pointer_cast< WidgetSet >(resource) );
   if( tmp )
   {
       ...
   }
}

(我相當確定這實際上是我的意思)使我遇到了一個非常類似的錯誤:

UI.o:在函數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對Graphics :: Widgets :: WidgetSet'collect2:typeld的引用返回1退出狀態

dynamic_cast_tag只是boost / shared_ptr.hpp中的一個空結構。 只能猜測boost可能與該錯誤有任何關系。

傳遞WidgetSet :: Ptr完全不需要進行強制轉換,並且構建良好(這就是為什么我認為對此問題的解答比標准答案還多的原因)。

顯然,我正在修剪很多可能很重要的細節。 我的下一步是將其縮減為無法構建的最小示例,但我認為我會嘗試采用這種懶惰的方法並首先在此處進行嘗試。

TIA!

編輯:顯示一些人們評論過的更多詳細信息

沒有看到整個AbstractGroup類,很難確定,但是聽起來您在類層次結構中可能沒有任何虛函數。 嘗試在AbstractGroup中定義一個虛擬析構函數(即使是內聯的也可以),看看是否有區別。 沒有單個虛函數,就沒有vtable,因此就沒有地方掛起typeinfo數據。

成員是私人的嗎? 如果是這樣,請嘗試在類成員之前添加protected: :。

class AbstractGroup
{
protected:
   typedef boost::shared_ptr<AbstractGroup> Ptr;
   ...
};


class WidgetSet : public AbstractGroup
{
protected:
    typedef boost::shared_ptr<WidgetSet> Ptr;
  ...
};

回到代碼示例之后,又出現了另一件事。 似乎您正在嘗試使用多態性。 唯一的問題是您正在將共享指針對象動態轉換為WidgetSet。 閱讀了一些文檔之后 ,我相信您應該編寫resource.get_pointer()因為您希望將指針轉換為shared_ptr對象而不是shared_ptr對象本身。 我對Boost並不是很熟悉,所以請告訴我這是否有意義!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM