2013-11-14 10 views
7

क्या यह कोड मान्य सी ++ (11) है?एकाधिक विरासत द्वारा छिपाई गई श्रेणी

struct Base { 
    template <typename> 
    struct nested; 
}; 
struct Derived1 : Base { }; 
struct Derived2 : Base { }; 
struct Derived3 : Derived1, Derived2 { }; 

typedef Derived3::nested<int> xxx; 

मैं

ऊपर कोड के साथ संकलित करने के लिए विफल रहता है क्या जानते हैं:

  • एप्पल LLVM 5.0 (बजना-500.2.75)
  • बजना 3,4

लेकिन यह सफलतापूर्वक संकलित करता है:

  • जीसीसी 4.9.0 20,131,110 (प्रायोगिक)
  • जीसीसी 4,8

इसके अलावा, अगर मैं एक गैर टेम्पलेट प्रकार के nested प्रकार, यानी

struct Base { 
    struct nested; 
}; 
... 
typedef Derived3::nested xxx; 

बदल तो यह काम करता है उपरोक्त कंपाइलर्स के साथ।

[संपादित करें] एक टेम्पलेट उर्फ ​​करने के लिए nested टेम्पलेट struct परिवर्तित करने से कुछ भी नहीं बदलता है;

template <typename> struct dependent { struct type; }; 
struct Base { 
    template <typename T> 
    using nested = typename dependent<T>::type; 
}; 

उपरोक्त कंपाइलरों के साथ एक ही परिणाम उत्पन्न करता है। [अंत संपादित करें]

N3242 से §10.1 [class.mi]

एक वर्ग एक अप्रत्यक्ष आधार वर्ग एक बार से अधिक हो सकता है और एक सीधा और एक अप्रत्यक्ष आधार वर्ग हो सकता है। ऐसी चीजें हैं जो ऐसी कक्षा के साथ की जा सकती हैं। गैर-स्थैतिक डेटा सदस्यों और प्रत्यक्ष आधार वर्ग के सदस्य कार्यों को व्युत्पन्न वर्ग के दायरे में संदर्भित नहीं किया जा सकता है। हालांकि, स्थैतिक सदस्यों, गणनाओं और प्रकारों को स्पष्ट रूप से संदर्भित किया जा सकता है।

मुझे लगता है कि इसका मतलब है कि कोड मान्य होना चाहिए, लेकिन मुझे यकीन है कि नहीं हूँ।

+0

मैंने ओपी द्वारा भरे [बग रिपोर्ट] (https://bugs.llvm.org/show_bug.cgi?id=17929) (आईडी 17 9 2 9) की तलाश की क्योंकि बग (?) अभी भी क्लैंग 5.0 में दिखता है .1। दुर्भाग्य से, कोई जवाब नहीं मिला है। – Caninonos

उत्तर

0

यह ठीक जीसीसी है या तो सही/अधिक उपयोगी

यह नहीं देख सकते हैं क्यों परिभाषा अस्पष्ट होगा क्योंकि आप एक प्रकार की नहीं एक सदस्य के बारे में बात कर रहे हैं (यह मानक बहुत दृढ़ता से चिपक), और प्रकार बराबर यदि उनके नाम सी में बराबर हैं ++ (नाम शामिल है और इस तरह के प्रकार के कुछ घायल प्रपत्र जा रहा है) कर रहे हैं

परिशिष्ट:

अगर "नेस्ट" और अन्य आधार में "नेस्ट" यह गलत होगा अलग थे। यह एक संरचना है, टाइप नहीं है या (जिसे स्कॉप्ड किया गया है)

जीसीसी अगर कुछ अस्पष्ट हो, तो जीसीसी चाहेगी, अगर आप इसे कुचलना चाहते हैं तो भी कोशिश करें। मुझे कोई कारण नहीं दिख रहा है कि जीसीसी को केवल अनुमोदित होने के बावजूद इसे खारिज क्यों किया जाना चाहिए।

+0

मुझे यकीन नहीं है कि मैं आपके परिशिष्ट को समझता हूं। क्या आपका मतलब है कि कोड 'नेस्टेड' था, उदाहरण के लिए, एक टेम्पलेट संरचना के बजाय एक C++ 11 टेम्पलेट उपनाम था? –

+0

@LouisDionne हाँ, क्योंकि वे अलग-अलग चीजों को उपनाम कर सकते हैं। उन्हें पार्सिंग के दौरान सदस्यों की तरह माना जाता है क्योंकि एक ही नियम लागू होते हैं, हीरा की समस्या उसके सिर को पीछे रखती है जिसके साथ आप उपयोग करना चाहते थे। –

+0

@LouisDionne क्या मैंने इस सवाल का जवाब दिया? .... –

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