2010-07-06 7 views
13
#include <iostream> 
#include <vector> 

int main() 
{ 
    class Int { 
     public: 
      Int(int _i) : i(i) {} 
     private: 
      int i; 
    }; 

    std::vector<Int> VI; 
} 

मैं ऊपर कोड को संकलित करने के लिए प्रयास करें और मिल गया निम्न त्रुटि संदेश:क्यों एक स्थानीय प्रकार वेक्टर बनाने करता असफल

foo.cc: In function 'int main()': 
foo.cc:13: error: 'main()::Int' uses local type 'main()::Int' 
foo.cc:13: error: trying to instantiate 'template<class _Alloc> class std::allocator' 
foo.cc:13: error: template argument 2 is invalid 
foo.cc:13: error: invalid type in declaration before ';' token 

आप में से किसी को भी मुझे बता सकते हैं क्यों मैं इस तरह बातें नहीं कर सकते हैं सी ++ में? अग्रिम में धन्यवाद।

+0

एक ही प्रश्न नहीं, लेकिन एक ही मुद्दे पर एक और सवाल: [स्थानीय वर्गों का उपयोग एसएलएल एल्गोरिदम के साथ] (http://stackoverflow.com/questions/742607/using-local-classes-with-stl-algorithms) –

उत्तर

11

मानक स्पष्ट रूप से स्थानीय वर्गों का उपयोग 14.3.1 [temp.arg.type]/2 में टेम्पलेट को तुरंत चालू करने के लिए प्रतिबंधित करता है।

एक स्थानीय प्रकार, कोई लिंक वाला कोई प्रकार, एक अनाम प्रकार या इन प्रकारों में से किसी एक प्रकार से मिश्रित प्रकार का उपयोग टेम्पलेट प्रकार-पैरामीटर के लिए टेम्पलेट-तर्क के रूप में नहीं किया जाएगा।

यह सी ++ 0x में बदला जाएगा।

+1

धन्यवाद, लेकिन क्यों? –

+2

मुझे अतीत में निर्णय के कारणों के बारे में पता नहीं है, लेकिन तथ्य यह है कि उन्होंने सी ++ 0x में उस सीमा को बदल दिया है, यह दर्शाता है कि कारण अन्य भाषा सुविधाओं के लिए इतने मजबूत या आवश्यक नहीं थे शुरू किया गया था - linkdas सोचो, जो वास्तव में जगह में कार्य वस्तुओं बनाते हैं। –

+4

AFAIK पुरानी समस्या टेम्पलेट तत्कालता के साथ थी। संकलक को यह तय करने की आवश्यकता है कि 'std :: vector ' पहले से ही तत्काल है, जब यह 'VI' की परिभाषा को देखता है। इसका मतलब है कि इसे 'int' की परिभाषा को ठीक से पहचानने में सक्षम होना चाहिए, जिसे उस विशेष' std :: vector 'को तुरंत चालू करने के लिए उपयोग किया गया था। आपको 'Int' के लिए प्रभावी रूप से एक अद्वितीय उलझन वाले नाम की आवश्यकता है। उपर्युक्त उदाहरण में, आपके पास '__main__Int' जैसा कुछ हो सकता है, लेकिन नेस्टेड अनामित स्कॉप्स के साथ यह भी कठिन है। – MSalters

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