पर विचार करें नीचे दिए गए कोड:क्यों एक इनलाइन घोषणा एक अपूर्ण प्रकार नहीं है?
struct Foo {
struct Bar;
Foo()
{
Bar bar; // Why isn't Bar an incomplete type?!
}
struct Bar {}; // Full definition
};
// struct Bar {}; // fails to compile due to incomplete type
int main()
{
Foo foo;
}
यह कम से कम 2 compilers (gcc5.2, clang3.5) के तहत ठीक संकलित करता है। मेरा प्रश्न है: के रूप में मैं निर्माता से ऊपर इसे आगे-घोषित
- क्यों नहीं
Bar
निर्माताFoo::Foo
में एक अधूरी प्रकार माना जाता है, लेकिन पूरी तरह से निर्माता के अंदर इसका इस्तेमाल?
जब भी मैं कक्षा के बाहर Foo::Bar
ले जाते हैं, दूसरे शब्दों Bar
में, एक स्टैंड-अलोन वर्ग बन जाता है मैं उम्मीद
error: aggregate 'Foo::Bar bar' has incomplete type and cannot be defined
सदस्य फ़ंक्शन निकाय इस तरह व्यवहार करते हैं जैसे कि उन्हें परिभाषित किया गया है (यानी, कक्षा परिभाषा के बाद)। –
मुख्य कारण यह है कि संकलक कक्षा के अंदर सभी परिभाषाओं की स्थानीय खोज कर सकता है, जब यह निर्धारित करता है कि प्रत्येक प्रकार को कैसे संभालना है। दायरे की पूरी तरह से जांच की जाती है, क्योंकि यह आपके कार्यक्रम का एक छोटा सा हिस्सा है, और इसे स्रोत कोड में घोषणाओं के क्रम पर भरोसा करने की आवश्यकता नहीं है। – tp1