error: argumento predeterminado para el parámetro 1

95

Recibo este mensaje de error con el siguiente código:

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

Primero pensé que los parámetros predeterminados no están permitidos como primer parámetro en C ++ pero está permitido.

pocoa
fuente
¿Podría darnos un poco más de detalles?
Etienne de Martel
Estoy usando Eclipse CDT con MinGW 5.1.6 en Windows.
pocoa

Respuestas:

208

Probablemente esté redefiniendo el parámetro predeterminado en la implementación de la función. Solo debe definirse en la declaración de función.

//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
fuente
1
Ahora dice: string Money :: asString () 'no coincide con ninguno en la clase' Money '
pocoa
1
@pocoa Todavía necesita mantener el bool shortVersionparámetro, simplemente elimine o comente el= true
Yacoby
@Yacoby: Gracias, tenías razón. No tiene ningún sentido, muy confuso.
pocoa
6
@pocoa: De hecho, tiene sentido. Si proporciona valores predeterminados para los parámetros, estos se completan en la persona que llama . Por lo tanto, deben estar en la declaración de la función, porque esto es lo que necesitan ver las personas que llaman. Si tuviera que repetirlos en la definición , sería redundante y más complicado de mantener. (Esta es también la razón por la que no estoy de acuerdo con Yacoby sobre comentar los parámetros predeterminados en la implementación. IME, en proyectos reales, dichos comentarios no estarán sincronizados con la declaración tarde o temprano.
sbi
1
La definición real es std::string Money::asString(bool). Tenga en cuenta que ni siquiera incluye el nombre del parámetro. Y, de hecho, puede usar nombres diferentes en la declaración que en la definición. (Esto es importante en un gran proyecto cuando, por cualquier motivo, desea cambiar el nombre en la definición, pero no desea volver a compilar millones de líneas de código que dependen de la declaración)
Sbi