वहाँ जहां एक टेम्पलेट हमेशा अमान्य है, कोई बात नहीं क्या टेम्पलेट तर्क आपूर्ति की जाती है कुछ स्थितियों, लेकिन कर रहे हैं संकलक, कि यह पता लगाने के लिए सक्षम नहीं है, क्योंकि यह हर प्रतिस्थापन की कोशिश करने की क्षमता नहीं है टेम्पलेट तर्कों का संभावित सेट। मानक के अनुसार ([temp.res]/8):
कोई वैध विशेषज्ञता एक टेम्पलेट के लिए उत्पन्न किया जा सकता है, और उस टेम्पलेट instantiated नहीं है, टेम्पलेट बीमार का गठन है, कोई निदान आवश्यक ।
इसका मतलब है कि संकलक स्मार्ट होना करने के लिए और साबित कोई वैध विशेषज्ञता है कि वहाँ है, और एक संकलन त्रुटि उत्पादन की अनुमति दी है, लेकिन यह भी करने के लिए नहीं बहुत चालाक हो, और एक संकलन त्रुटि का उत्पादन नहीं की अनुमति दी है। बेशक, टेम्पलेट को तुरंत चालू करने के बाद, कंपाइलर को त्रुटि का निदान करना होगा।
टेम्पलेट तर्कों के बिना टेम्पलेट के नाम का उपयोग करना अवैध नहीं है। कुछ परिस्थितियां हैं जहां संकलक तर्क को कम कर सकता है। उदाहरण के लिए:
template <class T>
void foo(T x);
int main() {
void (*p)(int) = foo; // p points to foo<int>
}
अपने कोड में, यह पता चला है कि आप एक संदर्भ में, जहां टेम्पलेट तर्क निष्कर्ष निकाला नहीं जा सकता है में Foo
का उपयोग किया है कि। अगर कंपाइलर्स चालाक थे, तो वे इसे समझ लेंगे। लेकिन तथ्य यह है कि उन्होंने इसे समझने के लिए प्रबंधन नहीं किया है इसका मतलब यह नहीं है कि आपका कोड सही है।
एर ... उस कन्स्ट्रक्टर के साथ 'बार' ऑब्जेक्ट बनाने का प्रयास करें, यदि आप कर सकते हैं। फिर हमें बताएं कि संकलक कोड स्वीकार करता है या नहीं। – WhiZTiM
@WhiZTiM यह कोड को अस्वीकार करता है।मुझे अभी भी यह वास्तव में अजीब लगता है कि दोनों कंपाइलर मेल नहीं खाते टेम्पलेट पैरामीटर प्रकार के बारे में शिकायत नहीं करते हैं। –