Pourquoi un static_cast d'un pointeur vers la base à un pointeur vers dérivé « invalide? »

StackOverflow https://stackoverflow.com/questions/5808758

  •  24-10-2019
  •  | 
  •  

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

Était-ce utile?

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
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top