erreur: argument par défaut donné pour le paramètre 1

95

Je reçois ce message d'erreur avec le code ci-dessous:

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

J'ai d'abord pensé que les paramètres par défaut ne sont pas autorisés en tant que premier paramètre en C ++, mais c'est autorisé.

pocoa
la source
Pourriez-vous donner un peu plus de détails?
Etienne de Martel
J'utilise Eclipse CDT avec MinGW 5.1.6 sous Windows.
pocoa

Réponses:

208

Vous redéfinissez probablement le paramètre par défaut dans l'implémentation de la fonction. Il ne doit être défini que dans la déclaration de fonction.

//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
la source
1
Maintenant, il dit: string Money :: asString () 'ne correspond à aucun dans la classe `Money'
pocoa
1
@pocoa Vous devez toujours conserver le bool shortVersionparamètre, il suffit de supprimer ou de commenter le= true
Yacoby
@Yacoby: Merci, vous aviez raison. Cela n'a aucun sens, très déroutant.
pocoa
6
@pocoa: En fait, cela a du sens. Si vous donnez des valeurs par défaut pour les paramètres, celles-ci sont renseignées à l' appelant . Ils doivent donc figurer dans la déclaration de la fonction, car c'est ce que les appelants doivent voir. Si vous deviez les répéter à la définition, ce serait redondant et plus compliqué à maintenir. (C'est aussi pourquoi je ne suis pas d'accord avec Yacoby sur la mise en commentaire des paramètres par défaut dans l'implémentation. IME, dans les projets réels, de tels commentaires ne seront pas synchronisés avec la déclaration tôt ou tard.
sbi
1
La définition réelle est std::string Money::asString(bool). Notez qu'il n'inclut même pas le nom du paramètre. Et, en effet, vous pouvez utiliser des noms différents dans la déclaration et dans la définition. (Ceci est important dans un grand projet lorsque - pour quelque raison que ce soit - vous voulez changer le nom dans la définition, mais ne voulez pas recompiler des millions de lignes de code qui dépendent de la déclaration.)
sbi