2017-07-24 2 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); 
} 

Vu le code ci-dessus, pourquoi suis-je recevoir « static_cast:.. Ne peut pas convertir myClass_p d'annuler * Je pensais que vous pourriez lancer tout pointeur vers un vide *ne peut pas lancer d'annuler *

+12

'foo' n'est pas un pointeur; c'est un 'boost :: shared_ptr '. – Justin

+2

@CaptainObvlious Je ne pense pas que les conversions implicites à 'void *' sont en C++ – NathanOliver

+0

@NathanOliver Ce n'était pas exactement clair. Je faisais référence aux pointeurs pas 'boost :: shared_ptr'. –

Répondre

2

foo ISN C'est un objet, cet objet est boost::shared_ptr<MyClass> et donc sémantiquement un pointeur intelligent, mais ce n'est pas un pointeur

En supposant l'hypothèse douteuse que ce que vous faites est logique, vous avez besoin de:

void *bar = foo.get(); 

boost::shared_ptr<MyClass>::get() renvoie l'objet partagé (ou 0 si vide).

+1

Merci, je pensais que les pointeurs intelligents pourraient être utilisés partout où des pointeurs réguliers pourraient être utilisés. Maintenant, j'ai du mal à passer de l'autre côté 'myClass_p pointer (static_cast (bar));' ne me permet pas de convertir de void * en MyClass * –

+0

@ClaudiusTurner En C++, n'importe quel pointeur peut être converti en 'void *' (I supprimé le static_cast <> 'redondant mais 'void *' ne peut pas être renvoyé aussi facilement Le système de type ne peut pas vous garantir que la conversion est valide (elle ne peut pas retracer le résultat de sa conversion) Vous avez donc besoin de 'static_cast <>' sur le chemin du retour, c'est pourquoi j'ai appelé ce que vous faisiez 'douteux': rarement en C++ moderne, il faut passer par 'void * ' risques de type système C vous permet de casse librement de 'void *' mais je considère qu'une erreur est corrigée en C++. – Persixty