2010-02-16 16 views
7

Observation: the codes pasted below were tested only with GCC 4.4.1, and I'm only interested in them working with GCC.वस्तु निर्माण/फॉरवर्ड समारोह घोषणा अस्पष्टता

हैलो,

यह सिर्फ कुछ समय है कि मैं एक वस्तु निर्माण बयान है कि मुझे समझ नहीं आया में ठोकर खाई के लिए नहीं था, और यह केवल आज मैंने देखा कि इससे क्या अस्पष्टता पेश की जा रही थी। मैं समझाऊंगा कि इसे पुन: उत्पन्न कैसे करें और यह जानना चाहेंगे कि इसे ठीक करने का कोई तरीका है (सी ++ 0x अनुमत)। ये रहा।

मान लीजिए कि एक वर्ग है जिसका कन्स्ट्रक्टर केवल एक तर्क लेता है, और यह एक तर्क का प्रकार एक डिफ़ॉल्ट कन्स्ट्रक्टर वाला एक और वर्ग है। उदाहरण के लिए:

Class c(ArgType()); // is this an object construction or a forward declaration 
        // of a function "c" returning `Class` and taking a pointer 
        // to a function returning `ArgType` and taking no arguments 
        // as argument? (oh yeh, loli haets awkward syntax in teh 
        // saucecode) 

मैं कहना है कि यह एक वस्तु निर्माण है, लेकिन संकलक यह एक आगे घोषणा है का कहना है:

struct ArgType {}; 

class Class 
{ 
public: 
    Class(ArgType arg); 
}; 

अगर मैं ढेर पर प्रकार Class की एक वस्तु का निर्माण करने की कोशिश, मैं एक अस्पष्टता मिल समारोह शरीर के अंदर। आपके लिए जो अभी भी इसे प्राप्त नहीं कर रहा है, यहां एक पूरी तरह से काम कर रहा उदाहरण है:

#include <iostream> 

struct ArgType {}; 
struct Class {}; 

ArgType func() 
{ 
    std::cout << "func()\n"; 
    return ArgType(); 
} 

int main() 
{ 
    Class c(ArgType()); 

    c(func); // prints "func()\n" 
} 

Class c(ArgType funcPtr()) // Class c(ArgType (*funcPtr)()) also works 
{ 
    funcPtr(); 
    return Class(); 
} 

तो ठीक है, पर्याप्त उदाहरण। कोई भी मुझे बिना किसी विरोधी-मूर्खतापूर्ण (मैं पुस्तकालय डेवलपर हूं, और मुहावरेदार पुस्तकालयों जैसे लोगों) के बिना इसे पाने में मदद कर सकता हूं?

-

कोई बात नहीं। यह Most vexing parse: why doesn't A a(()); work? का डुप्लिकेट है।

धन्यवाद, एसबीआई।

+0

आपका कोड जी के साथ ++ मेरे लिए संकलित उदाहरण पर - जो बिट आपको लगता है काम नहीं करना चाहिए करते हैं? –

+0

यह काम करने या काम नहीं करने का मामला नहीं है। समस्या यह है कि मैं सिर्फ 'क्लास' प्रकार का ऑब्जेक्ट बनाना चाहता था और इसके कन्स्ट्रक्टर को 'ArgType' टाइपलाइन प्रकार के ऑब्जेक्ट को पास करना चाहता था .. लेकिन यह आगे की घोषणा के रूप में पहचानता है। मैं कोड जोड़ दूंगा जो मैं काम करना चाहता था लेकिन सिर्फ एक सेकंड नहीं कर सकता। –

+0

इसके बारे में भूल जाओ, नील। एसबीआई के जवाब को देखो, यह मेरी समस्या है। –

उत्तर

5

इसे "सी ++ के सबसे परेशान पार्स" के रूप में जाना जाता है। here, here, और here देखें।

1

के आधार पर "C++ 0x अनुमति" सही जवाब है (शायद) के लिए परिभाषा को बदलने के लिए:

Class c(ArgType {}); 

सरल, सीधा और पूरी तरह से पुस्तकालय के उपयोगकर्ता पर बोझ डालता है लेखक नहीं!

संपादित करें: हाँ, सीटीओआर लागू किया जाता है - सी ++ 0x प्रारंभ-सूची सूचियों को सीमित करने के लिए एक अनूठा तरीका के रूप में सूची-प्रारंभिक जोड़ता है। इसे आपके नमूने में गलत तरीके से नहीं किया जा सकता है, लेकिन अन्यथा अर्थ लगभग समान है जैसे कि आप ब्रांड्स का उपयोग करते हैं। N3000 देखें, तीसरा बुलेट बिंदु §8.5.4/3 के तहत। आप प्रारंभिक सूची को एक तर्क के रूप में प्राप्त करने के लिए एक ctor लिख सकते हैं, या प्रारंभकर्ता सूची में आइटम को व्यक्तिगत रूप से ctor तर्कों के साथ मेल किया जा सकता है।

+0

रुको .. लेकिन वह कन्स्ट्रक्टर को कॉल नहीं करेगा, है ना? –

+1

दरअसल यह जीसीसी 4.4.1 को स्वीकार्य नहीं लगता है। अन्य संयोजन हालांकि हैं: 'कक्षा सी {ArgType {}}; 'या' कक्षा सी {ArgType()}; और कन्स्ट्रक्टर का आह्वान करने के एक गैर-सी ++ 0x संस्करण जोड़ना: 'कक्षा सी ((ArgType())); ' – UncleBens

1

चलिए थोड़ा सा सरल बनाते हैं।

int f1(); 

वह क्या है? कंपाइलर (और मैं) कहता हूं कि यह एक पूर्णांक लौटने वाले फ़ंक्शन के लिए एक आगे की घोषणा है।

इस बारे में कैसे?

int f2(double); 

संकलक (और मैं) कहते हैं कि यह एक समारोह में एक डबल तर्क ले रहे हैं और किसी पूर्णांक लौटने के लिए एक आगे घोषणा है।

तो आप इस की कोशिश की है:

ClassType c = ClassType(ArgType()); 

चेक बाहर C++ फैक लाइट explanations के लिए constructors और

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