2011-04-27 4 views
5

Base to Pointer에서 Derived 포인터로의 static_cast가 왜 "유효하지 않습니까?"

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

mTree->는 getNode (그룹 ID)를 PCSNode *를 반환

그래서 나는이 코드가 있습니다. 노드는 공개적으로 PCSNode에서 파생됩니다.

내가 static_cast에서 발견 한 문서의 모든이 효과에 뭔가 말 : ". static_cast 연산자와 같은 파생 클래스에 대한 포인터를 기본 클래스에 대한 포인터를 변환하는 등의 작업에 사용할 수 있습니다"

그러나, 엑스 코드의 (GCC) 컴파일러 PCSNode *이 * 유효하지 않으며 허용되지 않는 노드에서 static_cast이라고 말했다. 이 이유

이유라도? 나는 C 스타일 캐스트로 전환하면 컴파일러에서 아무런 불만이 없습니다.

고마워.

업데이트 : 질문에 대한 답변이되었다하더라도, 나는 경우 다른 사람의 완전성에 대한 컴파일러 오류를 게시합니다이 같은 문제 :

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

+3

당신이 정확한 컴파일러 오류를 할 수 있나요? 단지 거기에 const와 관련되거나 비슷한 것이 없다는 것을 확인하십시오. (당신이 설명하는 정보에 의해 그것이 작동해야 함) – Shiroko

+0

"노드가 공개적으로 PCSNode에서 파생되었습니다"??? 나는''Node''가''PCSNode''에 대한 기본 클래스와 같은 "Node'"에서 공개적으로 파생 된 "PCSNode"를 의미한다고 생각합니다. 권리? –

+0

PCSNode는 실제로 트리에 대한 포인터를 포함하고 있기 때문에 기본 클래스입니다. Node는 트리에있을 수있는 변형 노드입니다. – alk3ovation

답변

22

이유는 Node의 정의가 아니라고 가능성이 높습니다을 컴파일러에서 볼 수 있습니다 (예 : forward-declared 일 수도 있음 : class Node;).

자체 포함 된 예 :

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

그게 다야! 감사! – alk3ovation

+0

순환 종속성 문제로 인해 정의를 사용할 수없는 경우 수행 할 수있는 작업은 무엇입니까? 어떤 종류의 던지기가 아직도 끝날 수 있습니까? –

+0

reintepret_cast는 항상 같은 크기로 포인터를 캐스팅 할 때 작동합니다. – GolDDranks

관련 문제