2010-04-29 10 views
6

मैं इस उदाहरण में, एक व्युत्पन्न वर्ग में एक टेम्प्लेटेड आधार वर्ग के सदस्य चर का उपयोग करने के कोशिश कर रहा हूँ:का उपयोग करते हुए सदस्य चर एक टेम्प्लेटेड आधार वर्ग (C++) से विरासत में मिली

template <class dtype> 
struct A { 
    int x; 
}; 

template <class dtype> 
struct B : public A<dtype> { 
    void test() { 
     int id1 = this->x;  // always works 
     int id2 = A<dtype>::x; // always works 
     int id3 = B::x;   // always works 
     int id4 = x;   // fails in gcc & clang, works in icc and xlc 
    } 
}; 

जीसीसी और बजना दोनों कर रहे हैं इस चर का उपयोग करने के बारे में बहुत पसंद है, और इसके लिए एक स्पष्ट दायरा या "इस" के स्पष्ट उपयोग की आवश्यकता है। कुछ अन्य कंपाइलर्स (एक्सएलसी और आईसीसी) के साथ, चीजें काम करती हैं जैसा कि मैं उम्मीद करता हूं। क्या यह एक्सएलसी और आईसीसी का एक कोड है जो मानक नहीं है, या जीसीसी और क्लैंग में एक बग है?

+1

इसी प्रकार का प्रश्न: http://stackoverflow.com/questions/11405/gcc-problem-using-a-member-of-a-base-class-that-depends-on-a-template-argument –

उत्तर

5

आप शायद आईसीसी में गैर-सख्त मोड में संकलित कर रहे हैं। वैसे भी, x अयोग्य है, इसलिए इसे टेम्पलेट पैरामीटर पर निर्भर किसी भी बेस क्लास में नहीं देखा जाएगा। तो आपके कोड में, कोई स्थान नहीं है जहां x पाया गया है, और आपका कोड अमान्य है।

अन्य नाम लुकअप के दूसरे रूप (कक्षा सदस्य पहुंच लुकअप, और योग्य लुकअप) का उपयोग करके देखे जाते हैं। वे दोनों फॉर्म आश्रित आधार वर्गों में देखेंगे यदि वे कर सकते हैं (यानी यदि वे निर्भर हैं, और इस प्रकार टेम्पलेट को तत्काल करते समय देखा जाता है जब dtype ज्ञात है - आपके सभी अन्य नाम टेम्पलेट पैरामीटर पर निर्भर हैं)।

यहां तक ​​कि जीसीसी अपने नवीनतम संस्करणों में भी सही ढंग से लागू नहीं करते हैं, और कुछ आश्रित नाम still resolve against dependent bases अयोग्य लुकअप के दौरान।

संबंधित मुद्दे