2012-03-07 21 views
11

मैं एक पूर्णांक सरणीस्टैक पर सरणी आकार निर्दिष्ट करने के लिए int से const int को कैसे परिवर्तित करें?

#include<iostream> 
using namespace std; 

int main(){ 

    int n1 = 10; 
    const int N = const_cast<const int&>(n1); 
    //const int N = 10; 
    cout<<" N="<<N<<endl; 
    int foo[N]; 
    return 0; 
} 

हालांकि करने के लिए ढेर पर एक निश्चित आकार आवंटित करने के लिए कोशिश कर रहा हूँ, इस अंतिम पंक्ति है, जहां मैं N उपयोग कर रहा हूँ एक निश्चित
error C2057: expected constant expression परिभाषित करने के लिए पर एक त्रुटि देता है।

हालांकि, अगर मैं N को const int N = 10 के रूप में परिभाषित करता हूं, तो कोड ठीक से संकलित करता है। const int के रूप में इसे ट्राट करने के लिए मुझे n1 टाइपकास्ट कैसे करना चाहिए?

मैंने कोशिश की:const int N = const_cast<const int>(n1) लेकिन इससे त्रुटि मिलती है।

संपादित करें: मैं इसे संकलित करने के लिए एमएस वीसी ++ 2008 का उपयोग कर रहा हूं ... g ++ के साथ यह ठीक संकलित करता है।

उत्तर

17

मैं n1 कैसे टाइपकास्ट एक const int के रूप में यह इलाज के लिए चाहिए?

आप इस उद्देश्य के लिए नहीं कर सकते हैं।

सरणी का आकार इंटीग्रल कॉन्स्टेंट अभिव्यक्ति (आईसीई) कहा जाना चाहिए। मूल्य संकलन समय पर computable होना चाहिए। एक const int (या अन्य कॉन्स्ट-क्वालिफाइड इंटीजर-टाइप ऑब्जेक्ट) का उपयोग इंटीग्रल कॉन्स्टेंट एक्सप्रेशन में ही किया जा सकता है, अगर यह स्वयं इंटीग्रल कॉन्स्टेंट एक्सप्रेशन के साथ शुरू होता है।

एक गैर-कॉन्स्ट ऑब्जेक्ट (जैसे n1) इंटीग्रल कॉन्स्टेंट अभिव्यक्ति में कहीं भी दिखाई नहीं दे सकता है।

क्या आपने std::vector<int> का उपयोग करने पर विचार किया है?

[नोट - कलाकार पूरी तरह से अनावश्यक है। निम्न में से दोनों दोनों बिल्कुल एक जैसे हैं:

const int N = n1; 
const int N = const_cast<const int&>(n1); 

--End नोट]

+2

बस एक और विस्तार जोड़ने के लिए: जीसीसी एक विस्तार के रूप में यह संकलित - वास्तव में, यह अन्य भाव भी है कि के रूप में नहीं कर रहे हैं अनुमति देता है अनुरूपता के करीब, जैसे 'int x (int a) {int b [a]; } ' –

+0

आह, धन्यवाद, @ जेरीकॉफिन। जब मैंने पोस्ट किया तो मैंने संपादन को नहीं देखा। –

3

केवल निश्चित-आकार सरणियों कि जिस तरह से आवंटित किया जा सकता है। या तो गतिशील रूप से स्मृति आवंटित करें (int* foo = new int[N];) और जब आप पूरा कर लें, तो इसे हटाएं, या (अधिमानतः) std::vector<int> का उपयोग करें।

(संपादित करें: GCC accepts that as an extension, लेकिन यह सी ++ मानक का हिस्सा नहीं है।)