2015-07-08 19 views
13

मुझे समझ में क्यों अनुसरण करने में त्रुटि है कोशिश कर रहा हूँ: "त्रुटि के साथसदस्य समारोह

class Foobar { 
public: 
    static void do_something(); 
}; 

static void Foobar::do_something() {} // Error! 

int main() { 
    Foobar::do_something(); 
} 

यह त्रुटियों: सदस्य समारोह की घोषणा नहीं कर सकते हैं 'static void Foobar :: do_something()' के लिए स्थिर लिंक "जी ++ में, और" त्रुटि: 'स्थिर' केवल क्लास परिभाषा के अंदर निर्दिष्ट किया जा सकता है "clang ++ में।

मैं समझता हूं कि इसे ठीक करने का तरीका लाइन 6 पर do_something की परिभाषा में "स्थैतिक" को निकालना है। हालांकि, मुझे समझ में नहीं आता कि यह एक मुद्दा क्यों है। क्या यह एक सांसारिक कारण है, जैसे कि "सी ++ व्याकरण इतना निर्देशित करता है", या कुछ और जटिल हो रहा है?

+0

[संभावित सदस्य कार्य त्रुटि का संभावित डुप्लिकेट; हस्ताक्षर सही तरीके से कैसे लिखें?] (Https://stackoverflow.com/questions/8130066/static-member-functions-error-how-to-properly-write-the-ignature) –

उत्तर

29

मुझे लगता है कि यह मुद्दा यह है कि कीवर्ड static में सी ++ में कई अलग-अलग अर्थ हैं और ऊपर दिए गए कोड में उन्हें दो अलग-अलग तरीकों से उपयोग किया जाता है।

सदस्य कार्यों के संदर्भ में, static का अर्थ है "इस सदस्य समारोह एक रिसीवर वस्तु नहीं है। यह मूल रूप से एक सामान्य कार्य है कि वर्ग के दायरे से अंदर नेस्टेड रहा है।"

फ़ंक्शन घोषणाओं के संदर्भ में, static का अर्थ है "यह फ़ंक्शन केवल इस फ़ाइल में स्कॉप्ड है और अन्य स्थानों से नहीं कहा जा सकता है।"

जब आप

static void Foobar::do_something() {} // Error! 

लिख कर समारोह लागू किया संकलक static यहाँ व्याख्या मतलब करने के लिए "मैं इस सदस्य समारोह को लागू कर रहा हूँ, और मैं सिर्फ इस फ़ाइल की स्थानीय कि समारोह बनाना चाहते हैं।" सी ++ में इसकी अनुमति नहीं है क्योंकि इससे कुछ भ्रम पैदा होता है: यदि कई अलग-अलग फाइलें सभी ने सदस्य फ़ंक्शन के अपने कार्यान्वयन को परिभाषित किया है और फिर उन्हें लिंक करने से टकराव से बचने के लिए static घोषित किया है, तो अलग-अलग स्थानों से समान सदस्य फ़ंक्शन को कॉल करने से अलग व्यवहार होगा!

सौभाग्य से, के रूप में आप बताया गया है, एक आसान ठीक है: बस परिभाषा से static कीवर्ड हटा दिया जाएगा:

void Foobar::do_something() {} // Should be good to go! 

यह बिल्कुल ठीक है क्योंकि संकलक पहले से ही जानता है कि do_something एक static सदस्य समारोह है, आप के बाद से है इसके बारे में पहले बताया था।

आशा है कि इससे मदद मिलती है!

+1

यह समझ में आता है, धन्यवाद! मुझे लगता है कि संकलक स्थिर शून्य कुछ_फंक्शन() {...} और स्थैतिक शून्य Foobar :: some_method() {...} के बीच अंतर कर सकता है और उन्हें अलग-अलग व्यवहार कर सकता है, लेकिन इससे दोनों के लिए मनुष्यों के लिए पार्स करना मुश्किल हो जाएगा विभिन्न अर्थशास्त्र और बहुत समान वाक्यविन्यास। मैं समाधान से बहुत खुश नहीं हूं, क्योंकि इससे यह देखना मुश्किल हो जाता है कि इसके कार्यान्वयन (टिप्पणियों के बिना) एक विधि स्थिर है, लेकिन ओह ठीक है। –

+0

जब आप बैठते हैं 'यह मूल रूप से एक सामान्य कार्य है जो सामान्य रूप से कक्षा के दायरे के अंदर घोंसला है' क्या आपका मतलब वैश्विक है? – TheLogicGuy

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