2017-07-24 42 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

相关问题