2010-03-18 15 views
14
void foo() { 
    struct Foo { .. }; 
    std::vector<Foo> vec; // why is this illegal? 
} 

मैं बाहरी दुनिया में फू वापस नहीं कर रहा हूं। यह सिर्फ एक अस्थायी प्रकार है जिसे मैं फ़ंक्शन के भीतर उपयोग करता हूं।एक std :: वेक्टर स्थानीय प्रकार क्यों नहीं ले सकता है?

+0

+1 अच्छा सवाल! इसके बारे में कभी नहीं सुना है =) – SadSido

+0

@anon: क्या मुझे पता चलेगा कि आपने किस कंपाइलर का उपयोग किया था? – jasonline

+0

@anon: मैं इसे विज़ुअल सी ++ 2005 में संकलित कर सकता हूं, लेकिन मुझे लगता है कि यह मानक का पालन नहीं करता है अगर इसका वास्तव में उल्लेख किया गया है। मैक्रोज़ पर – jasonline

उत्तर

14

एक स्थानीय वर्ग टेम्पलेट तर्क नहीं हो सकता है। क्योंकि मानक का कहना है: -

14.3.1 पैरा 2: "एक स्थानीय प्रकार, कोई संबंध के साथ एक प्रकार, एक अनाम प्रकार या एक प्रकार इन प्रकार से किसी से बढ़ एक टेम्पलेट तर्क के रूप में नहीं किया जाएगा एक टेम्पलेट प्रकार पैरामीटर के लिए। "

[Example: 
template <class T> class X { /* ... */ }; 
void f() 
{ 
struct S { /* ... */ }; 
X<S> x3; // error: local type used as templateargument 
X<S*> x4; // error: pointer to local type used as templateargument 
} 
-end example] [Note: a template type argument may be an incomplete 
type (3.9). ]" 

एक वर्कअराउंड here c.l.C++ पर सुझाया गया है।

अद्यतन: कुछ चर्चाएं थीं कि स्थानीय वर्गों को टेम्पलेट तर्क के रूप में क्यों संभव नहीं है? C.std.C++ पर लिंक here और here लिंक पर चर्चा करते हैं।

3

लघु जवाब: क्योंकि सी ++ मानक तो कहते हैं (अनुभाग 14.3.1)

लांग जवाब: समय है कि सी ++ मानकीकृत था, सी ++ मानक समिति का मानना ​​था कि वहाँ कार्यान्वयन और प्रदर्शन किया जाएगा मुद्दे। उन डर निराधार हो गए और सी ++ 0x मानक के अंतिम मसौदे के रूप में, उन्होंने निर्णय को उलट दिया है।


एक और अधिक व्यावहारिक टिप्पणी पर, कुछ compilers पहले से ही नए C++ 0x नियमों का समर्थन:

  • MacOSX के लिए आप की आवश्यकता होगी जीसीसी> = -std=c++0x कमांड लाइन पैरामीटर साथ 4.5
  • माइक्रोसॉफ्ट संकलक आप> = vc8/VS2005 /Za विकल्प (अक्षम भाषा एक्सटेंशन) के बिना
की आवश्यकता होगी के लिए
संबंधित मुद्दे