2011-06-02 13 views
28

मुझे इस वर्ग को main.cpp फ़ाइल से ले जाने के बाद कोड के इस टुकड़े में समस्या हो रही है और इसे .h और .cpp में विभाजित किया गया है, संकलक ने शून्य पैरामीटर का उपयोग करने वाले डिफ़ॉल्ट पैरामीटर के बारे में शिकायत करना शुरू कर दिया है।संकलक मेरे डिफ़ॉल्ट मानकों के बारे में शिकायत कर रहा है?

/* PBASE.H */ 
    class pBase : public sf::Thread { 
private: 
    bool Running; 

public: 
    sf::Mutex Mutex; 
    WORD OriginalColor; 
    pBase(){ 
     Launch(); 
     Running = true; 
     OriginalColor = 0x7; 
    } 
    void progressBar(int , int); 
    bool key_pressed(); 
    void setColor(int); 
    void setTitle(LPCWSTR); 
    bool test_connection(){ 
     if(Running == false){ 
      return 0; 
     } 
     else{ 
      return 1; 
     } 
    return 0; 
    } 
    void Stop(){ 
     Running = false; 
     if(Running == false) Wait(); 
    } 
}; 

/* PBASE.CPP */ 

    // ... other stuff above 

    void pBase::setColor(int _color = -1){ 
     if(_color == -1){ 
      SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | OriginalColor); 
      return; 
     } 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | _color); 

} 

और VC2010 से लिया त्रुटि,

त्रुटि 4 त्रुटि C2572: 'pBase :: setColor': डिफ़ॉल्ट पैरामीटर के परिभाषा: पैरामीटर 1

उत्तर

89

आपको घोषणाओं में केवल तर्कों के लिए डिफ़ॉल्ट मान निर्दिष्ट करना है, लेकिन परिभाषा में नहीं।

class pBase : public sf::Thread { 
    // .... 
    void setColor(int _color = -1); 
    // .... 
} ; 

void pBase:: setColor(int _color) 
{ 
    // .... 
} 

एक सदस्य समारोह के तर्क या तो घोषणा या परिभाषा पर दोनों नहीं में जा सकते हैं के लिए डिफ़ॉल्ट मान। आईएसओ/आईईसी से उद्धरण 14882: 2003 (ई) 8.3.6

6) वर्ग टेम्पलेट्स के सदस्य कार्यों के अलावा, उस वर्ग परिभाषा के बाहर दिखाई देता है एक सदस्य समारोह परिभाषा डिफ़ॉल्ट तर्क सेट में जुड़ जाते हैं कक्षा परिभाषा में सदस्य समारोह घोषणा द्वारा प्रदान किए गए डिफ़ॉल्ट तर्कों का। कक्षा टेम्पलेट के सदस्य फ़ंक्शन के लिए डिफ़ॉल्ट तर्क क्लास टेम्पलेट के भीतर सदस्य फ़ंक्शन की आरंभिक घोषणा पर निर्दिष्ट किए जाएंगे। [उदाहरण:

class C { 
    void f(int i = 3); 
    void g(int i, int j = 99); 
}; 

void C::f(int i = 3) // error: default argument already 
{ }     // specified in class scope 

void C::g(int i = 88, int j) // in this translation unit, 
{ }        // C::g can be called with no argument 

अंत उदाहरण]

मानक प्रदान की उदाहरण के अनुसार, यह वास्तव में जिस तरह से तुमने किया था काम करना चाहिए। जब तक आप like this नहीं कर लेते हैं, तो आपको वास्तव में त्रुटि नहीं मिलनी चाहिए। मुझे यकीन नहीं है कि यह वास्तव में मेरे समाधान के साथ आपके मामले में क्यों काम करता है। शायद कुछ दृश्य स्टूडियो संबंधित, मुझे लगता है।

+1

ठीक है! यह काम करता है (थोड़ा अजीब हालांकि यह ठीक काम कर रहा था जब मेरे पास एक फ़ाइल में पूरा कोड था)। – Christian

7

ठीक है! यह काम करता है (थोड़ा अजीब हालांकि यह ठीक काम कर रहा था जब मेरे पास एक फ़ाइल में पूरा कोड था)।

मुझे यह समस्या भी थी जब मैंने कई फ़ाइलों में कोड को स्थानांतरित करना शुरू किया। असली समस्या यह है कि मैं हेडर फाइल के शीर्ष पर

#pragma once 

लिखना भूल गया था, और इसलिए यह काम करता है कई बार (हर बार हेडर फाइल मूल फ़ाइल से लागू किया जा रहा था), इस वजह से फिर से परिभाषित करने गया था डिफ़ॉल्ट पैरामीटर त्रुटि का पुनर्वितरण।

+0

इसके लिए धन्यवाद, मुझे लगता है कि इस त्रुटि के कारण मैं अपना दिमाग खो रहा हूं। – Wodzu

+0

मेरे पास मेरे फ़ंक्शन में परिभाषित '' 'स्थिर स्थिरांक char'' सरणी थी और '' #pragma एक बार 'चाल चल रही थी और मैंने जो डिफ़ॉल्ट तर्क सेट किया था उसे स्वीकार कर लिया था। – reliasn

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

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