Fehler: Standardargument für Parameter 1

95

Ich erhalte diese Fehlermeldung mit dem folgenden Code:

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

Zuerst dachte ich, dass Standardparameter als erster Parameter in C ++ nicht erlaubt sind, aber es ist erlaubt.

Pakao
quelle
Könnten Sie etwas mehr Details geben?
Etienne de Martel
Ich verwende Eclipse CDT mit MinGW 5.1.6 unter Windows.
Pocoa

Antworten:

208

Wahrscheinlich definieren Sie den Standardparameter in der Implementierung der Funktion neu. Es sollte nur in der Funktionsdeklaration definiert werden.

//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){
}
Yacoby
quelle
1
Jetzt heißt es: string Money :: asString () 'stimmt mit keinem in der Klasse `Money'
überein
1
@pocoa Sie müssen den bool shortVersionParameter noch beibehalten , entfernen oder kommentieren Sie einfach die= true
Yacoby
@ Yacoby: Danke, du hattest recht. Es macht keinen Sinn, sehr verwirrend.
Pocoa
6
@pocoa: Eigentlich macht es Sinn. Wenn Sie Standardwerte für Parameter angeben, werden diese beim Aufrufer ausgefüllt . Sie müssen also in der Funktionsdeklaration enthalten sein, denn das müssen die Aufrufer sehen. Wenn Sie sie bei der Definition wiederholen müssten, wäre die Wartung überflüssig und aufwändiger. (Dies ist auch der Grund, warum ich mit Yacoby nicht einverstanden bin, die Standardparameter in der Implementierung zu kommentieren. IME, in realen Projekten werden solche Kommentare früher oder später nicht mit der Erklärung synchron sein.
sbi
1
Die eigentliche Definition ist std::string Money::asString(bool). Beachten Sie, dass der Name des Parameters nicht einmal enthalten ist. In der Tat können Sie in der Deklaration andere Namen als in der Definition verwenden. (Dies ist in großen Projekten wichtig, wenn Sie - aus welchen Gründen auch immer - den Namen in der Definition ändern möchten, aber nicht Millionen von Codezeilen neu kompilieren möchten, die von der Deklaration abhängen.)
sbi