2011-04-27 21 views
5

así que tengo este código:¿Por qué un static_cast desde un puntero a base a un puntero a derivado es "inválido"?

Node* SceneGraph::getFirstNodeWithGroupID(const int groupID) 
{ 
    return static_cast<Node*>(mTree->getNode(groupID)); 
} 

mTree-> getNode (ID_grupo) devuelve un PCSNode *. El nodo se deriva públicamente de PCSNode.

Todos los documentos que he encontrado en static_cast dicen algo en este sentido: "El operador static_cast se puede usar para operaciones tales como convertir un puntero a una clase base en un puntero a una clase derivada."

Sin embargo, el compilador de XCode (GCC) dice que static_cast es de PCSNode * a Node * no es válido y no está permitido.

¿Alguna razón por la que esto es? Cuando lo cambio a un modelo C, no hay quejas del compilador.

Gracias.

ACTUALIZACIÓN: A pesar de que la pregunta fue respondida, voy a publicar el error del compilador para la integridad en caso de que alguien más tiene el mismo problema:

error: Semantic Issue: Static_cast from 'PCSNode *' to 'Node *' is not allowed

+3

¿Se puede poner el compilador de error exacto? Solo para asegurarse de que no haya nada relacionado o similar allí. (según la información que describa, debería funcionar) – Shiroko

+0

"El nodo se deriva públicamente de PCSNode" ??? Supongo que quiere decir que '' PCSNode' se deriva públicamente de 'Node'" que es lo mismo que "' Node' es una clase base para 'PCSNode'". ¿Derecha? –

+0

PCSNode es en realidad la clase base porque contiene los punteros para el árbol, el nodo es un nodo transformacional que puede estar en un árbol. – alk3ovation

Respuesta

22

La razón más probable es que la definición de Node no es visible para el compilador (p. ej., puede haberse declarado solo hacia adelante: class Node;).

autónomo ejemplo:

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 
} 
+0

¡Eso fue todo! ¡Gracias! – alk3ovation

+0

¿Qué se puede hacer en caso de que la definición no pueda estar disponible debido a problemas de dependencia circular? ¿Se puede hacer algún tipo de yeso? –

+0

Siempre hay reintepret_cast, que funciona si está lanzando punteros, ya que son del mismo tamaño. – GolDDranks

Cuestiones relacionadas