निम्नलिखित पर विचार करें:खाका उर्फ दृश्यता नेस्टेड वर्ग में
template<typename X>
struct Z {};
struct A
{
using Z = ::Z<int>;
struct B : Z
{
using C = Z;
};
};
यह ठीक संकलित करता है। अच्छा लगा। लेकिन अब Z
में दूसरा पैरामीटर जोड़ें:
template<typename X, typename Y>
struct Z {};
struct A
{
template<typename X>
using Z = ::Z<X, int>;
struct B : Z<B>
{
using C = Z<B>; // error: too few template arguments for class template 'Z'
};
};
ठीक है, शायद यह भावना है कि वर्ग A
में टेम्पलेट उर्फ Z
की परिभाषा दिखाई जब नेस्टेड वर्ग B
पाने है बनाता है, लेकिन इसके शरीर के अंदर नहीं है, क्योंकि त्रुटि ट्रिगर Z
की वैश्विक परिभाषा में दो पैरामीटर हैं।
लेकिन क्यों व्यवहार पहले मामले में अलग है, जब Z
A
में सिर्फ एक प्रकार उर्फ है?
template<typename X, typename Y>
struct Z {};
template<typename T>
struct A
{
template<typename X>
using Z = ::Z<X, int>;
struct B : Z<B>
{
using C = Z<B>;
};
};
अब त्रुटि चला गया है:
अंत में, A
एक टेम्पलेट बनाते हैं। क्यों?
(बजना 3.6 और जीसीसी 4.9.2 पर परीक्षण किया गया)
वाह। यह काफी स्पष्ट है, धन्यवाद। वास्तव में त्रुटि तब दिखाई दी जब 'ए' एक टेम्पलेट होने से रोका, जिसे मैंने सोचा था कि कोड को बहुत सरल बना देगा। हालांकि, अब मुझे दो 'जेड' के लिए दो अलग-अलग नामों का उपयोग करने के लिए मजबूर किया गया है, जो केवल कोड को उलझन में डाल देता है। यदि कोई बेहतर कामकाज है, तो कृपया मुझे बताएं। – iavr
@iavr 'सी = जेड का उपयोग करने के बारे में क्या;'? अपने मूल एक ('अज्ञात प्रकार का नाम 'Z'') पर :-) हाँ, यह यहाँ इस सरलीकृत कोड पर काम करता है – Columbo
अब जब कि प्रभावशाली है (के लिए' A' एक टेम्पलेट जा रहा है काम नहीं करेगा), लेकिन नहीं। मुझे यह जांचना होगा कि अंतर कहां है। 'ए 'अब एक टेम्पलेट नहीं है, और मैं इसे इस तरह से रखना चाहता हूं। – iavr