2017-07-24 73 views
-3
class MyClass { 
    public: 
     register_callback(int, void*); 
} 

typedef boost::shared_ptr<MyClass> myClass_p; 

class MyOtherClass { 
    public: 
    registerItem(std::pair<std::string, myClass_p>insertItem) { 
     auto foo = insertItem.second; 
     void *bar = static_cast<void*>(foo); 
} 

鑑於上面的代碼,爲什麼會收到「的static_cast:。不能從myClass_p轉換爲void *我想你可以施放任何指針爲void *不能轉換爲void *

+12

'foo'不是指針;它是一個'boost :: shared_ptr '。 – Justin

+2

@CaptainObvlious我不認爲隱式轉換爲void *'在C++中 – NathanOliver

+0

@NathanOliver這並不完全清楚。我指的是不是'boost :: shared_ptr'的指針。 –

回答

2

foo ISN這是一個對象,這個對象恰好是一個boost::shared_ptr<MyClass>,所以它在語義上是一個智能指針,但它不是一個指針

假設你正在做的事情的可疑假設是合理的,你需要:

void *bar = foo.get(); 

boost::shared_ptr<MyClass>::get()返回共享對象(或0如果爲空)。

+1

謝謝,我認爲智能指針可以在任何可以使用常規指針的地方使用。現在我遇到了另一種方式'myClass_p指針(static_cast (bar));''讓我無法從void *轉換爲MyClass * –

+0

@ClaudiusTurner在C++中,任何指針都可以轉換爲'void *'(I刪除多餘的'static_cast <>'但是'void *'不能被輕易地轉換回來。正確的,類型系統不能保證你的轉換是有效的(它不能跟蹤它被轉換的東西),所以你在返回的時候需要'static_cast <>'這就是爲什麼我打電話給你做'可疑'的原因。現代C++通過'void *'很少遇到這種情況,除非可能與遺留接口,因爲這些類型系統的風險,C可以讓你從「void *」中免費獲得,但我認爲這是一個在C++中修正的錯誤。 – Persixty

相關問題