2012-08-31 28 views
8

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

इस पर wikipedia लिंक है, लेकिन यह टेम्पलेट कक्षाओं के मामले में क्या होता है पर स्पष्ट स्पष्टीकरण प्रदान नहीं करता है।

उत्तर

13

यह काम करता है क्योंकि [basic.def.odr]/5 स्पष्ट रूप से अनुमति टेम्पलेट्स दोहराया जा करने के लिए:

नहीं हो सकता है एक वर्ग प्रकार की एक परिभाषा (धारा 9), गणना प्रकार (7.2), बाहरी लिंकेज के साथ इनलाइन समारोह (7.1 की तुलना में अधिक .2), कक्षा टेम्पलेट (क्लॉज 14), गैर स्थैतिक फ़ंक्शन टेम्पलेट (14.5.6), क्लास टेम्पलेट (14.5.1.3) का स्थिर डेटा सदस्य, क्लास टेम्पलेट का सदस्य फ़ंक्शन (14.5.1.1), या टेम्पलेट विशेषज्ञता जिसके लिए कुछ टेम्पलेट पैरामीटर निर्दिष्ट नहीं हैं (14.7, 14.5.5) एक प्रोग्राम में प्रदान किया गया है कि प्रत्येक परिभाषा एक अलग अनुवाद इकाई में दिखाई देती है, और बशर्ते परिभाषा निम्नलिखित आवश्यकताओं को पूरा करे। ...

आवश्यकताओं काफी लंबा कर रहे हैं, तो मैं उन्हें यहाँ नकल नहीं है, लेकिन अनिवार्य रूप से वे कहते हैं कि प्रत्येक डुप्लिकेट परिभाषा समरूप होना चाहिए (अन्यथा कार्यक्रम अपरिभाषित है व्यवहार)।