2012-02-10 12 views
13

this one पर अनुवर्ती प्रश्न।संकलक टेम्पलेट तर्क सूची के अंदर बेस क्लास कन्स्ट्रक्टर का चयन क्यों करता है?

असल में, निम्न कोड में, क्यों संकलक लगता है कि BA<B> अंदर C रों निर्माता में B आधार वर्ग के (दुर्गम) निर्माता का उल्लेख?

struct B{}; 

template <typename T> 
struct A : private T{}; 

struct C : public A<B>{                    
    C(A<B>); // ERROR HERE 
}; 

Live example on Ideone. आउटपुट:

prog.cpp:1:9: error: 'struct B B::B' is inaccessible
prog.cpp:7:7: error: within this context

नोट है कि एक ही त्रुटि पॉप अप होता है अगर आप A<B*>, A<B&> या यहाँ तक कि A<const B> के निर्माता तर्क बदल जाते हैं। यह भी ध्यान रखें कि तीन एमएसवीसी 10, जीसीसी 4.7 और क्लैंग 3.1 टीओटी त्रुटि होगी, इसलिए यह सी ++ स्पेक में कुछ होना चाहिए। यह क्या है?

+0

मुझे नहीं पता कि आपने एक ही विषय क्यों बनाया है! आप उस विषय को बेहतर बनाने के लिए उस विषय को संपादित कर सकते थे। – Nawaz

+3

@ नवाज: यह मूल रूप से एक अलग सवाल है। मैं पूछता हूं "क्यों", दूसरा सवाल पूछता है "क्या करना है"। – Xeo

+0

मैन, मुझे कक्षा ए के साथ एक से अधिक बार काट दिया गया है: निजी नोट कॉपी करने योग्य {कक्षा बी: निजी नोट कॉपी करने योग्य {}}; '। मुझे लगता है कि यह वैश्विक दायरे को देखने से पहले वर्ग के दायरे में प्रतीकों को देखता है। –

उत्तर

15

मानक इंजेक्शन वर्ग नाम मूल नामों से कम पहुंच योग्य होने की अनुमति देता है। यह भी, §11.1/5 में एक नोट में बताया गया है एक साथ एक उदाहरण के साथ:

[ Note: In a derived class, the lookup of a base class name will find the injected-class-name instead of the name of the base class in the scope in which it was declared. The injected-class-name might be less accessible than the name of the base class in the scope in which it was declared. —end note ]

[ Example:

class A { }; 
class B : private A { }; 
class C : public B { 
    A *p; // error: injected-class-name A is inaccessible 
    ::A *q; // OK 
}; 

end example ]

A अयोग्य एक्सेस करना इंजेक्शन नाम है, जो सुलभ क्योंकि यह निजी विरासत से आता नहीं है का उपयोग करता है। A तक पहुंचने योग्य घोषित नाम का उपयोग करता है, जो वैश्विक दायरे में उपलब्ध है।

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

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