2008-08-30 12 views
22

सी ++ कई फाइलों में टेम्पलेट्स घोषित करते समय बल्कि गड़बड़ लगते हैं। अधिक विशेष रूप से, टेम्पलेटेड कक्षाओं के साथ काम करते समय, लिंकर एक एकल कंपाइलर ऑब्जेक्ट फ़ाइल में कक्षा के लिए सभी विधि परिभाषाओं की अपेक्षा करता है। जब आप खाता शीर्षलेख, अन्य घोषणाएं, विरासत इत्यादि लेते हैं, तो चीजें वास्तव में गन्दा हो जाती हैं।टेम्पलेट्स कई फाइलों में फैले

क्या कई फाइलों में टेम्पलेट सदस्य परिभाषाओं को व्यवस्थित करने या पुनर्वितरण के लिए कोई सामान्य सलाह या कामकाज है?

उत्तर

23

मेरे लिए काम किया है रहे हैं?

हां; नहीं है।

सी ++ कल्पना (किसी भी कार्यान्वयन की जटिलताओं की वजह से) एक संकलक परमिट के लिए इन्स्टेन्शियशन के बिंदु पर पूरे टेम्पलेट (घोषणा और परिभाषा) "देख" सक्षम होने के लिए, और सबसे compilers इस आवश्यकता को बरकरार रहती है। उपरोक्त यह है कि # किसी भी टेम्पलेट हेडर का समावेशन # टेम्पलेट को तुरंत चालू करने के लिए आवश्यक किसी भी और सभी स्रोत को शामिल करना होगा।

इस से निपटने का सबसे आसान तरीका हैडर को सबकुछ में डंप करना, इनलाइन जहां उचित, बाहर की आवश्यकता है।

यदि आप वास्तव में इसे एक अस्वीकार्य affront के रूप में देखते हैं, तो एक सामान्य विकल्प टेम्पलेट को सामान्य शीर्षलेख/कार्यान्वयन जोड़ी में विभाजित करना है, और उसके बाद # शीर्षलेख के अंत में कार्यान्वयन फ़ाइल को शामिल करना है।

सी ++ की "निर्यात" सुविधा एक और कामकाज प्रदान नहीं कर सकती है या नहीं। सुविधा खराब रूप से समर्थित है और खराब परिभाषित है; हालांकि इसे सिद्धांत रूप में टेम्पलेट्स के किसी प्रकार के अलग संकलन की अनुमति देनी चाहिए, यह आवश्यक रूप से मांग को रोक नहीं सकता है कि संकलक पूरे टेम्पलेट बॉडी को देखने में सक्षम हो।

5

कितनी फाइलें? यदि आप कक्षा परिभाषाओं को कार्यान्वयन से अलग करना चाहते हैं तो C++ faqs में this article आज़माएं। फिलहाल उस काम के बारे में मुझे पता है, लेकिन कुछ आईडीई (उदाहरण के लिए ग्रहण सीडीटी) इस विधि को सही तरीके से लिंक नहीं करेगा और आपको बहुत सारी त्रुटियां मिल सकती हैं। हालांकि अपने खुद के makefiles वहाँ किसी भी सामान्य सलाह या आयोजन या एक से अधिक फ़ाइलों में टेम्प्लेटेड सदस्य परिभाषाओं पुनर्वितरित करने का समाधान लिख रहे हैं या का उपयोग कर विजुअल C++ यह हमेशा :-)

+0

लेख के लिए लेख –

+2

लिंक के लिए लिंक के लिए +1 पुरानी हो चुकी है! – iamantony

3

जब/अपने संकलक C++ 0x समर्थन करता है तो, extern कीवर्ड परिभाषाओं से अलग टेम्पलेट घोषणाओं के लिए इस्तेमाल किया जा सकता है।

एक संक्षिप्त स्पष्टीकरण के लिए here देखें।

इसके अलावा, खंड 6.3, "पृथक्करण मॉडल," सी ++ टेम्पलेट्स की: पूरी गाइड डेविड Vandevoorde और निकोलाई एम Josuttis द्वारा अन्य विकल्पों का वर्णन।

alt text http://ak.buy.com/db_assets/prod_images/235/31025235.jpg

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