Pourquoi un static_cast d'un pointeur vers la base à un pointeur vers dérivé « invalide? »
Question
J'ai donc ce code:
Node* SceneGraph::getFirstNodeWithGroupID(const int groupID)
{
return static_cast<Node*>(mTree->getNode(groupID));
}
mTree-> GetNode (groupID) retourne un PCSNode *. Noeud est publiquement dérivé de PCSNode.
Tous les documents que j'ai trouvé quelque chose de dire static_cast à cet effet: «L'opérateur static_cast peut être utilisé pour des opérations telles que la conversion d'un pointeur vers une classe de base à un pointeur vers une classe dérivée »
Et pourtant, le compilateur XCode (GCC) dit que le static_cast est de PCSNode * au nœud * est invalide et non autorisée.
Quel est le motif pourquoi est-ce? Lorsque je passe à un casting de style C, il n'y a pas de plaintes du compilateur.
Merci.
Mise à jour: Je Même si la question a répondu posterai l'erreur du compilateur pour être complet au cas où quelqu'un d'autre a le même problème:
Erreur: sémantique Problème: static_cast de « PCSNode * » à « Node * » est pas permis
La solution
The reason is most likely that the definition of Node
is not visible to the compiler (e.g., it may have been only forward-declared: class Node;
).
Self-contained example:
class Base {};
class Derived; // forward declaration
Base b;
Derived * foo() {
return static_cast<Derived*>( &b ); // error: invalid cast
}
class Derived : public Base {}; // full definition
Derived * foo2() {
return static_cast<Derived*>( &b ); // ok
}