जब भी एक्स टेम्पलेट पैरामीटर पर है या निर्भर करता है तो आपको छोटा संस्करण typename X::Y
करने की आवश्यकता है। जब तक एक्स ज्ञात नहीं है, संकलक यह नहीं बता सकता कि वाई एक प्रकार या मान है या नहीं। इसलिए आपको यह निर्दिष्ट करने के लिए typename
जोड़ना होगा कि यह एक प्रकार है।
उदाहरण के लिए:
template <typename T>
struct Foo {
typename T::some_type x; // T is a template parameter. `some_type` may or may not exist depending on what type T is.
};
template <typename T>
struct Foo {
typename some_template<T>::some_type x; // `some_template` may or may not have a `some_type` member, depending on which specialization is used when it is instantiated for type `T`
};
एसबीआई टिप्पणी में बताते हैं के रूप में, अस्पष्टता के कारण कि Y
एक स्थिर सदस्य, एक enum या एक समारोह हो सकता है। X
के प्रकार को जानने के बिना, हम नहीं बता सकते हैं। मानक निर्दिष्ट करता है कि संकलक को यह मानना चाहिए कि यह typename
कीवर्ड का उपयोग कर स्पष्ट रूप से किसी प्रकार का लेबल नहीं है।
और यह लग रहा है टिप्पणीकर्ताओं वास्तव में मुझे एक और संबंधित मामले का उल्लेख करने के साथ ही चाहते हैं की तरह:;)
निर्भर नाम एक समारोह सदस्य टेम्पलेट है, और आप एक स्पष्ट टेम्पलेट तर्क (foo.bar<int>()
से कॉल करने, के लिए उदाहरण), आपको foo.template bar<int>()
में फ़ंक्शन नाम से पहले template
कीवर्ड जोड़ना होगा।
इसका कारण यह है कि टेम्पलेट कीवर्ड के बिना, कंपाइलर मानता है कि bar
एक मान है, और आप ऑपरेटर (operator<
) से कम इसे कम करना चाहते हैं।
मैं आपको टेम्पलेट को पढ़ने की सलाह देता हूं: http://womble.decadentplace.org.uk/c++/template-faq.html –