2016-04-20 6 views
16

यह सुनिश्चित नहीं है कि कहां से पूछना है (अगर यह अनुचित प्रश्न है तो इसे बंद करने के लिए स्वतंत्र महसूस करें) लेकिन मुझे विशेष रूप से सी ++ 17 प्रस्तावों में कुछ भी नहीं मिला है, न तो this या this नेस्टेड नेमस्पेस अतिरिक्त से निपटने के दौरान इसका उल्लेख किया है सी ++।क्या सी ++ 17 नेस्टेड कक्षाओं की घोषणा की अनुमति होगी?

class A 
{ 
public: 
    class B; //forward-declared INSIDE class/namespace 
}; 

class A::B //defined outside 
{ 
}; 

इस सी ++ 17 में संभव हो जाएगा:

तो वर्तमान में इस एकमात्र विकल्प है?

class A::B; //forward declared NESTED outside of parent class/namespace 

class C 
{ 
    A::B *b; 
}; 

और फिर या तो इस (1)

class A::B //definition of A::B without defining A 
{ 

}; 

या इस (2)

class A 
{ 
public: 
    class A::B 
    { 

    }; 
}; 

या (नेस्टेड namepsace परिभाषाओं के प्रस्ताव को हो रहा है के रूप में) इस [3]

class A 
{ 
public: 
    class B; 
}; 

class A::B 
{ 
}; 

मुझे परिभाषा पर संदेह है एफ A::BA को परिभाषित किए बिना पहले काम नहीं कर सकता है (हालांकि प्रस्ताव इसे अनुमति देता है)।

+4

* कक्षा * es * नेमस्पेस * से बहुत अलग हैं। लेकिन देखें [पी 028 9] (http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2016/p0289r0.pdf)। – cpplearner

उत्तर

6

Forward declarations of nested classesP0289R0 शीर्षक वाले मुद्दे पर एक प्रस्ताव है। हालांकि, जैसा कि आप पिछले Trip Report: C++ Standards Meeting in Jacksonville, February 2016 से देख सकते हैं, यह प्रस्ताव उन प्रस्तावों के प्रति उदार था जिनके लिए आगे के काम को प्रोत्साहित किया जाता है। मैं समिति के फैसले के हवाले कर रहा हूँ (जोर मेरा):

यह X::A* तरह बातें X के लिए एक परिभाषा की आवश्यकता होती है भी हैडर में प्रदर्शित करने के के बिना एक शीर्षक में प्रदर्शित करने की स्वीकृति (आगे X और X::A की घोषणा पर्याप्त होगी)। ईडब्ल्यूजी ने को का उपयोग करने के मामले का उपयोग किया, क्योंकि वर्तमान में पर कई कक्षा परिभाषाएं शीर्षकों में दिखाई देती हैं क्योंकि शीर्षलेख में परिभाषित इंटरफेस पॉइंटर्स या प्रकार के नेस्टेड कक्षाओं के संदर्भों का उपयोग करते हैं। कई विवरण अभी भी पर काम करने की आवश्यकता है। (उदाहरण के लिए, क्या हुआ अगर X के परिभाषा किसी अन्य अनुवाद इकाई (टीयू) में प्रकट नहीं होता होता है? अगर X की एक परिभाषा एक और टीयू में दिखाई देता है तो क्या होता है, लेकिन एक नेस्टेड class A परिभाषित नहीं करता है? क्या होगा अगर ऐसा होता है एक नेस्टेड क्लास ए परिभाषित करता है, लेकिन यह निजी है? इनमें से कुछ या सभी का जवाब होना चाहिए "बीमार गठित, कोई निदान आवश्यक नहीं है", क्योंकि की त्रुटियों का निदान करने के लिए इस प्रकार के महत्वपूर्ण लिंकर समर्थन की आवश्यकता होगी।)

+0

मुझे गलत हो सकता है लेकिन उठाए गए प्रश्नों का उत्तर दिया जाना प्रतीत होता है। यहां तक ​​कि अगर इसे पहले अधिक प्रतिबंधक संस्करण के रूप में अपनाया गया था, तो यह बहुत लाभकारी होगा और अगर यह ठीक हो जाए तो बाद के मानकों में आराम किया जा सकता है। मुझे लगता है कि बड़ी चिंता कागज में उल्लिखित खोए गए गुण हो सकती है - अर्थात तथ्य यह है कि एक्स :: ए कहता है कि वर्तमान में स्वचालित रूप से परिभाषा भी है और (इसलिए) किसी भी नाम लुकअप को नहीं लेता है। हालांकि मुझे यह एक स्वीकार्य मूल्य मिल रहा है।उम्मीद है कि यह अभी तक सभी काम करेगा और यह प्रस्ताव इसे अंतिम सी ++ 17 में बनाता है! – Resurrection

+0

@ पुनरुत्थान सौभाग्य से या दुर्भाग्य से उठाए गए प्रश्नों का उत्तर दिया गया है या नहीं, यह निर्णय लेने के लिए सी ++ समिति तक है :)। निजी तौर पर, मुझे उम्मीद है कि यह प्रस्ताव इसे सी ++ 17 में लाएगा क्योंकि मुझे यह उपयोगी लगता है और सामान्य रूप से मुझे लगता है कि नेस्टेड कक्षाओं की अगली घोषणा भाषा में एक छेद है जिसे बंद किया जाना चाहिए। – 101010

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