2011-06-02 72 views
28

我在從main.cpp文件中取出這個類並將其分割爲.h和.cpp後,我遇到了這段代碼,編譯器開始抱怨我在void中使用的默認參數。編譯器抱怨我的默認參數?

/* 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) 
{ 
    // .... 
} 

一個成員函數的參數在聲明或定義但不能兩者都可以去的默認值。從ISO/IEC 14882引用:2003(E)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 2011-06-02 04:46:11

7

好吧!它的工作原理(有點奇怪,因爲當我將整個代碼放在一個文件中時它工作的很好)。

當我開始將代碼移動到多個文件時,我也遇到了這個問題。真正的問題是,我忘了寫

#pragma once 

在頭文件的頂部,並且因此它被重新定義的功能的多次(每個頭文件正在從父文件調用時),這導致重新定義默認參數錯誤。

+0

謝謝你,我開始認爲我因爲這個錯誤而失去了自己的想法。 – Wodzu 2016-10-05 18:06:32

+0

我有一個在我的函數中定義的'''const const char'''數組,''''#pragma once'''做了這個訣竅並接受了我設置的默認參數。 – reliasn 2016-12-15 04:15:27