स्थैतिक सदस्य कार्य त्रुटि; हस्ताक्षर कैसे ठीक से लिखें?


165

वर्तमान हस्ताक्षर का उपयोग करके g ++ में अपना कोड संकलित करने का प्रयास करते समय मुझे एक त्रुटि मिल रही है:

cannot declare member function static void Foo::Bar(std::ostream&, const Foo::Node*) to have static linkage

मेरा सवाल दुगना है:

  1. यह इस तरह से संकलन क्यों नहीं करता है?
  2. सही हस्ताक्षर क्या है, और क्यों?

C ++ का उपयोग करते समय हस्ताक्षर हमेशा से मेरी मृत्यु रहे हैं

संपादित करें: यहाँ क्लास हेडर फ़ाइल है, साथ ही:

class Foo {


public:
    Foo();

    ~Foo();

    bool insert(const Foo2 &v);

    Foo * find(const Foo2 &v);

    const Foo * find(const Foo2 &v) const;

    void output(ostream &s) const;

private:
    //Foo(const Foo &v);
    //Foo& operator =(const Foo &v);
    //Not implemented; unneeded


    struct Node {
        Foo2 info;
        Node *left;
        Node *right;
    };

    Node * root;

    static bool insert(const Foo2 &v, Node *&p);


    static void output(ostream &s, const Node *p);


    static void deleteAll(Node *p);

आपको जी ++ त्रुटि से सभी प्रासंगिक लाइनें शामिल होनी चाहिए ।
कीथ लेयने

5
आपके द्वारा सूचीबद्ध त्रुटि संदेश आपके द्वारा पोस्ट किए गए कोड द्वारा उत्पादित नहीं किया जा सकता है। Foo::Barआपके कार्यक्रम के टुकड़े में कहीं भी नहीं है । कृपया एक पूर्ण , न्यूनतम कार्यक्रम पोस्ट करें जो आपके द्वारा की जा रही त्रुटि को प्रदर्शित करता है। एक पूरा कार्यक्रम वह है जिसे हम ठीक-ठीक संकलित कर सकते हैं और आपके जैसा ही त्रुटि संदेश प्राप्त कर सकते हैं। आपकी त्रुटि को दूर करने के लिए असंबंधित प्रत्येक पंक्ति के साथ एक न्यूनतम कार्यक्रम है। आपके द्वारा पोस्ट किया गया कोड टुकड़ा न तो पूर्ण है और न ही न्यूनतम। अधिक जानकारी के लिए sscce.org देखें ।
Rob

जवाबों:


415

मैं अनुमान लगा रहा हूँ कि आपने कुछ ऐसा किया है:

class Foo
{
    static void Bar();
};

...

static void Foo::Bar()
{
    ...
}

" static void Foo::Bar" गलत है। आपको दूसरे " static" की आवश्यकता नहीं है ।


25
@ ओलिवर: लेकिन क्यों?
नरेंगी

14
@narengi: क्योंकि यही सी ++ मानक व्याकरण को परिभाषित करता है।
ओलिवर चार्ल्सवर्थ

2
"दूसरा" कौन सा है? घोषणाकर्ता में से एक या इसके कार्य की परिभाषा में?
dhein

44
@Zaibis दूसरा वाला पहला नहीं है, बल्कि दूसरा वाला है।
मैक्सदेव

24
फ़ंक्शन स्टेटमेंट की तुलना में कीवर्ड स्टैटिक का विधि घोषणा में समान अर्थ नहीं है। और एक फ़ंक्शन (परिभाषा) स्थिर नहीं हो सकता है यदि यह एक वर्ग विधि (घोषणा) है। इसलिए, आप इसे स्थिर घोषित कर सकते हैं, लेकिन इसे स्थिर नहीं परिभाषित कर सकते हैं। फ़ंक्शन परिभाषा में 'स्टेटिक' का C के समान अर्थ है, जो एक वर्ग विधि के साथ असंगत है।
डाबीचो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.