エラー:パラメータ1に指定されたデフォルトの引数


95

以下のコードでこのエラーメッセージが表示されます。

class Money {
public:
    Money(float amount, int moneyType);
    string asString(bool shortVersion=true);
private:
    float amount;
    int moneyType;
};

まず、C ++では最初のパラメーターとしてデフォルトのパラメーターは許可されていませんが、許可されていると思いました。


もう少し詳しく教えてください。
エティエンヌデマルテル

WindowsでMinGW 5.1.6とEclipse CDTを使用しています。
pocoa 2010年

回答:


208

関数の実装でデフォルトパラメータを再定義している可能性があります。関数宣言でのみ定義する必要があります。

//bad (this won't compile)
string Money::asString(bool shortVersion=true){
}

//good (The default parameter is commented out, but you can remove it totally)
string Money::asString(bool shortVersion /*=true*/){
}

//also fine, but maybe less clear as the commented out default parameter is removed
string Money::asString(bool shortVersion){
}

1
今それは言う:string Money :: asString() 'はクラス `Money'のどれにも一致しません
pocoa

1
@pocoa bool shortVersionパラメータを保持する必要があります。削除するか、コメント化してください= true
Yacoby

@ヤコビー:ありがとう、あなたは正しかった。それは意味をなさず、非常に混乱します。
pocoa 2010年

6
@pocoa:実際、それは理にかなっています。パラメータのデフォルト値を指定すると、これらは呼び出し側で入力されます。したがって、これら関数の宣言に含まれている必要があります。これは、呼び出し元が確認する必要があるためです。定義でそれらを繰り返す必要がある場合、それは冗長であり、維持するのがより面倒です。私は実装でデフォルトパラメータをコメントアウトについてYacobyに反対する理由(これもあるIMEは、実際のプロジェクトでは、このようなコメントは遅かれ早かれ宣言と同期していない状態になります。。
SBI

1
実際の定義はstd::string Money::asString(bool)です。パラメータの名前も含まれていないことに注意してください。そして実際、宣言では定義とは異なる名前を使用できます。(これは、何らかの理由で定義の名前を変更したいが、宣言に依存する数百万行のコードを再コンパイルしたくない場合に、巨大なプロジェクトで重要です。)
sbi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.