पर संकलन-समय त्रुटि का कारण बनने के लिए कैसे करें कभी-कभी सी ++ टेम्पलेट्स के साथ कोडिंग करते समय, आप उपयोगकर्ताओं को एक विशिष्ट विशेषज्ञता या विशेषज्ञता के सेट को तुरंत चालू करने से रोकना चाहते हैं, क्योंकि परिणाम गैरकानूनी होगा। तो आप एक (विशिष्ट या आंशिक) विशेषज्ञता को परिभाषित कर सकते हैं जिसकी परिभाषा, अगर तत्काल हो, तो संकलक त्रुटि उत्पन्न होगी। लक्ष्य होगा, यदि कोई उपयोगकर्ता टेम्पलेट को "दुरुपयोग" करता है, तो आपके हेडर फ़ाइल में एक टिप्पणी के बगल में एक कंपाइलर त्रुटि का कारण बनता है जो बताता है कि क्या नहीं करना है, संकलक को अपने आप से कुछ भ्रमित त्रुटि संदेश के साथ आने के बजाय डिवाइस, या हो सकता है कि संदिग्ध कोड संकलित करने की अनुमति दे।जानबूझकर टेम्पलेट इंस्टीट्यूशन
उदाहरण:
template <typename T> struct MyClassTemplate {
// ...
};
template <typename T> struct MyClassTemplate<T*> {
// Do not use MyClassTemplate with a pointer type!
typedef typename T::intentional_error err;
};
यह करने के लिए तरीके (चाहे अपने विशेषज्ञता कक्षा या समारोह की एक पूर्ण या आंशिक विशेषज्ञता है के आधार पर) की एक संख्या हैं। लेकिन इस्तेमाल किए गए वाक्यविन्यास को (?) टेम्पलेट पैरामीटर पर निर्भर होना चाहिए, या अन्यथा संकलक शिकायत करेगा जब यह जानबूझकर-त्रुटि परिभाषा को पार करता है। उपर्युक्त उदाहरण में एक छेद है जिसमें कोई व्यक्ति intentional_error
नेस्टेड प्रकार या सदस्य टाइपपीफ को जिद्दी रूप से परिभाषित कर सकता है (हालांकि मैं कहूंगा कि वे परिणामस्वरूप आने वाली किसी भी समस्या के लायक होंगे)। लेकिन यदि आप एक चाल का उपयोग बहुत फैंसी करते हैं, तो आपको एक अनिश्चित और/या भ्रामक संकलक त्रुटि संदेश प्राप्त होने की संभावना है, जो ज्यादातर उद्देश्य को हरा देता है।
क्या टेम्पलेट इंस्टॉलेशन को अस्वीकार करने के लिए बेहतर सरल तरीके हैं?
मुझे पता है कि सी ++ 0x में, टेम्पलेट अवधारणाओं और हटाए गए फ़ंक्शन घोषणाएं इस तरह की चीज़ पर अधिक बेहतर नियंत्रण प्रदान करती हैं, लेकिन मैं उन उत्तरों की तलाश कर रहा हूं जो वैध C++ 03 हैं।
इनमें से कुछ संकलन समय के बजाय लिंक समय पर त्रुटियां देने जा रहे हैं, है ना? – zwol
@Zack सभी संकलन समय पर त्रुटियां देंगे। –
ओह, ठीक है, क्योंकि एक वर्ग टेम्पलेट का दृष्टांत को एक एक पूर्ण वर्ग घोषणा होना आवश्यक है। मैं फ़ंक्शन टेम्पलेट्स के बारे में सोच रहा था। – zwol