2008-11-20 19 views
38

क्या हेडर फ़ाइल में एक एसटीएल कंटेनर घोषित करना संभव है?आगे एक एसटीएल कंटेनर घोषित करें?

#include <vector> 

class Foo 
{ 
private: 
    std::vector<int> container_; 
    ... 
}; 

मैं इस तरह कुछ करने के लिए सक्षम होना चाहते हैं:

namespace std 
{ 
    template <typename T> class vector; 
} 

class Foo 
{ 
private: 
    std::vector<int> container_; 
    ... 
}; 

इस किया जा सकता है उदाहरण के लिए, निम्न कोड ले?

उत्तर

27

vectorstd नामस्थान में अपरिभाषित व्यवहार है। तो, आपका कोड काम कर सकता है, लेकिन यह भी नहीं हो सकता है, और संकलक आपको यह बताने के लिए कोई दायित्व नहीं है कि आपका प्रयास कब काम नहीं करेगा। यह एक जुआ है, और मुझे नहीं पता कि मानक सी ++ हेडर को शामिल करने से बचने के लायक है। ।

निम्नलिखित comp.std.C++ संचालित चर्चा देखें:

forward declaring std::vector. Works, but is it legal and standard compliant?

+1

मैंने चर्चा के आपके लिंक का पालन किया, लेकिन लोग निष्कर्ष पर नहीं आ रहे हैं। जाहिर है, एसएलएल कार्यान्वयन मानक कंटेनरों में कोई टेम्पलेट पैरामीटर नहीं जोड़ना चाहिए। इसलिए, इसे टेम्पलेट घोषित करने की अनुमति दी जानी चाहिए। – Haplo

+1

यह अपरिभाषित है, @ हैप्लो। यदि कार्यान्वयन * आप * मानक कहता है, जो मानक कहता है उससे परे व्यवहार को परिभाषित करने के लिए चुनते हैं, लेकिन यह अभी भी अपरिभाषित है, इसलिए आपका कोड पोर्टेबल नहीं होगा। निष्कर्ष (बिना बकाया बयानों से निर्णय) यह है कि मानक को इसकी अनुमति देनी चाहिए, लेकिन नहीं, और दो कार्यवाही हैं: मानक प्रकारों को आगे घोषित उपयोगकर्ता structs में लपेटें, या केवल बुलेट काट लें और मानक शीर्षलेख शामिल करें । उत्तरार्द्ध करना आसान है। यूज़नेट पर –

+1

"अनचाहे बकाया वक्तव्य" शायद ही कभी एक आधिकारिक स्रोत हैं। लेकिन, जेरी कॉफिन सही है जब वह उद्धृत करता है [namespace.std]/1। व्यवहार में, यदि आपका कंपाइलर गैर-सिस्टम हेडर में 'नेमस्पेस std' घोषणाओं का निदान करता है, या यदि आपकी मानक लाइब्रेरी C++ में लागू नहीं की गई है, तो आपको कोई समस्या हो सकती है, लेकिन ये चीजें कभी नहीं होतीं – Potatoswatter

16

मुझे ऐसा नहीं लगता क्योंकि संकलक को यह जानने का कोई तरीका नहीं होगा कि container_ ऑब्जेक्ट के लिए कितना स्थान आवंटित किया जाए। सबसे अच्छा आप कर सकते हैं:

std::vector<int> *container_; 

और इसे कन्स्ट्रक्टर में नया, क्योंकि संकलक एक सूचक के आकार को जानता है।

+0

ठीक है जो मैं सिर्फ – badbadboy

+0

कहना चाहता था, लेकिन यह सभी अग्रेषण-घोषणाओं में एक समस्या है, जो 'नेमस्पेस std' में निर्दिष्ट नहीं है। तो यह _real_ प्रश्न का उत्तर देता है, न कि एक ओपी ने पूछा। : पी हम स्पष्ट रूप से कुछ कारण घोषित नहीं कर सकते हैं और फिर इसे मूल्य से तुरंत चालू कर सकते हैं। –

8

अलावा क्या अन्य लोगों ने कहा से (सिवाय एडम Rosenfield), आप पा सकते यह पता करने के लिए उपयोगी एक मंजूर तरीका है कि वहाँ iostreams और कुछ संबंधित टेम्पलेट्स को आगे घोषित करने के लिए: हेडर <iosfwd> (देखें http://msdn.microsoft.com/en-us/library/1af12yty%28VS.80%29.aspx)। यह उपयोगी होगा अगर मानक में ऐसे हेडर हों।

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