web-dev-qa-db-ja.com

コンパイラーがデフォルトのパラメーターについて不平を言っていますか?

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

42
Christian

引数にはデフォルト値を宣言でのみ指定し、定義では指定しないでください。

 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

—終了例]

提供されている標準の例によると、実際に機能するはずです。 このように を行っていない限り、実際にエラーを受け取るべきではありません。私のソリューションであなたのケースで実際に機能した理由はわかりません。おそらくビジュアルスタジオに関連したものだと思います。

127
Mahesh

よし!それは機能しました(コード全体を1つのファイルに収めたときに正常に機能していたため、少し奇妙です)。

また、コードを複数のファイルに移動し始めたときにもこの問題がありました。本当の問題は、私が書くのを忘れたことでした

#pragma once

ヘッダーファイルの先頭にあるため、関数を複数回再定義していました(ヘッダーファイルが親ファイルから呼び出されるたびに)。これにより、デフォルトパラメーターの再定義エラーが発生しました。

12
MasterHD