2012-08-17 14 views
10

मैं दृश्य स्टूडियो 2003 के साथ एक अजीब मामला कुछ हद तक वैध कारणों के लिए है, मैं निम्न पदानुक्रम है:गलत नाम संकल्प जब माता-पिता और भीतरी वर्ग में एक ही नाम

class A {}; 

class B : public A { 
public: 
    class A {}; 
}; 

class C : public B::A {}; 

है कि, मैं एक आंतरिक है बाहरी वर्ग के माता-पिता के समान नाम वाला वर्ग। जब CB::A से प्राप्त करने का प्रयास करता है, तो विजुअल स्टूडियो सोचता है कि मैं पैरेंट क्लास A पर इंगित कर रहा हूं, न कि B के भीतर नेस्टेड क्लास नहीं। जीसीसी आंतरिक वर्ग संस्करण को हल करने के लिए प्रतीत होता है क्योंकि मुझे उम्मीद है कि

क्या यह एक विजुअल स्टूडियो 2003 बग है, या क्या मैं इसे गलत कर रहा हूं? क्या कोई कामकाज है (विजुअल स्टूडियो को अपग्रेड करने के अलावा)?

+0

विज़ुअल सी ++ 2003 को नौ साल पहले रिलीज़ किया गया था। कई कारणों से अपग्रेड करना उचित होगा। –

+1

@JamesMcNellis अगर मैं इन चीजों का प्रभारी था तो हम बहुत समय पहले अपग्रेड कर चुके थे, लेकिन दुख की बात है कि मैं –

उत्तर

2

हां, यह वीएस2003 बग जैसा दिखता है। वर्कअराउंड सरल है - टाइपपीफ का उपयोग करें, यह इस तरह से काम करता है:

class A { public: int x; }; 
class B : public A { public: class A { public: int y; }; }; 

typedef B::A BA; 

class C: public BA {}; 

void f() 
{ 
    C cc; 
    cc.y = 0; 
} 
5

यह दृश्य सी ++ 2003 में एक बग की तरह दिखता है। विजुअल सी ++ 2012 का उपयोग करके, B::A सही श्रेणी A नामित, नेस्टेड क्लास A का सही नाम है।

+0

नहीं हूं, काम नहीं करने के लिए, मुझे नहीं पता: डिजाइन बल्कि संदिग्ध है। मैं नेस्टेड कक्षा का नाम बदलूंगा। अगर मेरे पास विजुअल सी ++ 2003 स्थापित है तो मैं यह देखने की कोशिश करता हूं कि क्या हो रहा है, लेकिन मैंने कुछ वर्षों में विजुअल सी ++ 2003 का उपयोग नहीं किया है। –

+0

मैं बेवकूफ था और मेरे सरलीकृत उदाहरण का परीक्षण नहीं किया; यह पता चला कि यह गलत था। अद्यतित एक समस्या को –

+2

@MichaelMrozek वीएस 2012 आंतरिक वर्ग के लिए हल करता है। – ForEveR

0

यह एक वीएस बग की तरह दिखता है,
मुझे पोस्टिंग के लिए धन्यवाद नहीं पता था।
मुझे लगता है कि वर्कअराउंड SafeInherit टेम्पलेट होगा, मुझे नहीं पता कि बेहतर नाम क्या होगा।

template <typename T> 
struct SafeInherit{ 
    typedef T Type; 
}; 

class B : public SafeInherit<A>::Type { 
    public: 
    class A {}; 
} 
संबंधित मुद्दे