2011-04-27 15 views
5

तो मेरे पास यह कोड है:एक पॉइंटर से आधार तक एक पॉइंटर से "अमान्य" व्युत्पन्न करने के लिए static_cast क्यों है?

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

mTree-> getNode (groupID) एक पीसीएसएनोड * देता है। नोड सार्वजनिक रूप से पीसीएसएनोड से लिया गया है।

static_cast पर मिले सभी दस्तावेज़ इस प्रभाव से कुछ कहते हैं: "static_cast ऑपरेटर का संचालन संचालन के लिए किया जा सकता है जैसे एक पॉइंटर को बेस क्लास में एक पॉइंटर में एक व्युत्पन्न वर्ग में परिवर्तित करना।"

फिर भी, एक्सकोड्स (जीसीसी) कंपाइलर का कहना है कि static_cast पीसीएसएनोड * से नोड * तक अमान्य है और इसकी अनुमति नहीं है।

ऐसा कोई कारण क्यों है? जब मैं इसे सी-स्टाइल कास्ट पर स्विच करता हूं, तो कंपाइलर से कोई शिकायत नहीं होती है।

धन्यवाद।

अद्यतन: भले ही प्रश्न का उत्तर दिया गया हो, फिर भी किसी और के पास एक ही समस्या होने पर मैं पूर्णता के लिए कंपाइलर त्रुटि पोस्ट करूंगा:

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

+3

आप सटीक संकलक त्रुटि रख सकते हैं? बस यह सुनिश्चित करने के लिए कि वहां कुछ भी सम्बंधित या समान नहीं है। (आपके द्वारा वर्णित जानकारी के अनुसार इसे काम करना चाहिए) – Shiroko

+0

"नोड सार्वजनिक रूप से पीसीएसएनोड से व्युत्पन्न है" ??? मुझे लगता है कि आपका मतलब है कि "पीसीएसएनओडी' सार्वजनिक रूप से' नोड' से लिया गया है "जैसा कि" नोड' 'पीसीएसएनोड के लिए आधार वर्ग है। " सही? –

+0

पीसीएसएनोड वास्तव में आधार वर्ग है क्योंकि इसमें पेड़ के लिए पॉइंटर्स होते हैं, नोड एक परिवर्तनकारी नोड है जो एक पेड़ में हो सकता है। – alk3ovation

उत्तर

22

कारण सबसे अधिक संभावना है कि Node की परिभाषा नहीं है कंपाइलर के लिए दृश्यमान (उदाहरण के लिए, यह केवल अग्रेषित किया जा सकता है: 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

संबंधित मुद्दे