मैं निम्नलिखित टेम्पलेट वर्ग और एक (वैश्विक) अपनी तरह का चर:का पता लगा रहा एक प्रकार सी में से प्राप्त किया जा सकता है अगर ++
template <typename ClassT>
struct ClassTester : public ClassT {
typedef ClassT type;
};
ClassTester<int> *aaa; // No error here
मैं एक संकलन त्रुटि उम्मीद होती है क्योंकि int
से प्राप्त नहीं किया जा सकता है, लेकिन इस विज़ुअल सी के तहत ठीक संकलित ++ 2010
अगर मैं सूचक निकालने के लिए, मैं उम्मीद संकलन त्रुटि (पूर्णांक से प्राप्त नहीं किया जा सकता) मिलती है:
ClassTester<int> bbb; // Error here
मैं w कि क्या दिया प्रकार एक वर्ग है कि से प्राप्त किया जा सकता है SFINAE परीक्षण के लिए इस वर्ग का उपयोग करने के anted:
template <typename T>
struct CanBeDerivedFrom {
template <typename C>
static int test(ClassTester<T> *) { }
template <typename>
static char test(...) { }
static const bool value = (sizeof(test<T>(0)) == sizeof(int));
};
लेकिन यह हमेशा सच रिपोर्ट करती है, यहां तक कि इसके बाद के संस्करण कारण की वजह से इस तरह के int
के रूप में आदिम प्रकार के लिए। क्या यह सी ++ का अपेक्षित/वैध व्यवहार है?
मुझे संदेह है कि एक पॉइंटर को घोषित करने/परिभाषित करने के लिए वास्तव में टेम्पलेट को तुरंत चालू करने की आवश्यकता नहीं होती है। आखिरकार, आप किसी भी चीज़ के लिए 'क्लासटेस्टर *' का उपयोग नहीं करते हैं। –
visitor
एक समान उदाहरण यह जांच करेगा कि टेम्पलेट पैरामीटर पीओडी या गैर पीओडी है या नहीं। –
मैं आगंतुक के रूप में सुझाव देने जा रहा था। मुझे विश्वास नहीं है कि एक सूचक घोषित करने से टेम्पलेट को चालू किया जाएगा, यही कारण है कि यह संकलित हो सकता है। सूचक के माध्यम से टेम्पलेट का उपयोग करके सदस्य तक पहुंचने का प्रयास करें, जो संकलक को तत्काल टेम्पलेट करने के लिए मजबूर करेगा। अन्यथा, मुझे भी यकीन नहीं है - लेकिन मुझे पता है कि आप एक पूर्णांक प्रकार का उत्तराधिकारी नहीं हो सकते हैं। – Jeremy