2011-10-10 43 views
1

我有一個基類多態類(具有虛方法)以及派生自它的派生類。 我嘗試使用下面的代碼無法使用派生的多態創建基類的shared_pointer

 boost::shared_ptr<base_class> ptr(new derived_class()); 

但是編譯器返回我下面的錯誤

cannot convert ‘fpga_northwest*’ to ‘fpga*’ in initialization 
    make: *** [../obj/ixecute_cmd_interface.o] Error 1 

讀環顧四周,我很想使用構建OK下面,但我有一些疑惑。你認爲這是正確的嗎?

 boost::shared_ptr<base_class> ptr_base; 
    boost::shared_ptr<derived_class> ptr_derived(new derived_class()); 
    ptr_base = boost::dynamic_pointer_cast<base_class>(ptr_derived); 

如果我使用boost::static_pointer_cast我有編譯器錯誤;因爲我從一個派生到一個基礎鑄造不應該更正確一個static_cast

感謝您的幫助

+0

嘗試'dynamic_cast (deriver_class對象)' – nmikhailov

+0

不明白,這似乎工作正常:http://www.ideone.com/N63Qf – Nim

+0

嗯,[這個例子](http:// ideone。 com/3Lzys)工作正常。你的代碼有什麼不同? –

回答

5
boost::shared_ptr<base_class> ptr(new derived_class()); 

這應該工作得很好。

也許這些類畢竟不相關?

也許那些類在這一點上是不完整的,所以編譯器不知道類是相關的? (儘管如此,這也會產生其他錯誤。)

+0

我會投票使用點的類不完整的定義... +1 –

+0

嗨我需要檢查'COS派生_類繼承base_class但它不起作用。 –

+0

..當這可能發生?我無法理解,因爲我在別處構建了一個示例,現在它構建了!?!?! –

3

這應該如原先所述的那樣工作。 derived_class *將會愉快地轉換成一個base_class *,用來構造shared_ptr。正如指出的那樣,ideone也會編譯它。我建議你的Boost安裝或編譯器有問題。

或者,正如指出的那樣,您的其他代碼。

+1

甚至與OP自己的代碼... –

+0

實際上,shared_ptr應該愉快地接受派生類指針作爲參數,然後做上傳。 – visitor

1

需要類型強制才能執行此強制轉換,該強制轉換是通過成員模板實現的。這在舊的編譯器上得不到很好的支持。因此它在這些編譯器上被禁用。你使用什麼編譯器?

相關問題