errore: argomento predefinito fornito per il parametro 1


95

Ricevo questo messaggio di errore con il codice seguente:

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

Per prima cosa ho pensato che i parametri predefiniti non sono consentiti come primo parametro in C ++ ma è consentito.


Potresti fornire qualche dettaglio in più?
Etienne de Martel

Sto usando Eclipse CDT con MinGW 5.1.6 su Windows.
pocoa

Risposte:


208

Probabilmente stai ridefinendo il parametro predefinito nell'implementazione della funzione. Dovrebbe essere definito solo nella dichiarazione della funzione.

//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
Ora dice: string Money :: asString () 'non corrisponde a nessuna nella classe `Money'
pocoa

1
@pocoa Hai ancora bisogno di mantenere il bool shortVersionparametro, basta rimuovere o commentare il= true
Yacoby

@ Yacoby: Grazie, avevi ragione. Non ha alcun senso, molto confuso.
pocoa

6
@pocoa: In realtà, ha senso. Se si forniscono valori predefiniti per i parametri, questi vengono compilati al chiamante . Quindi devono essere nella dichiarazione della funzione, perché questo è ciò che i chiamanti devono vedere. Se dovessi ripeterli alla definizione , sarebbe ridondante e più fastidioso da mantenere. (Questo è anche il motivo per cui non sono d'accordo con Yacoby sul commentare i parametri predefiniti nell'implementazione. IME, nei progetti reali tali commenti prima o poi non saranno sincronizzati con la dichiarazione.
sbi

1
La definizione attuale è std::string Money::asString(bool). Nota che non include nemmeno il nome del parametro. E, in effetti, puoi usare nomi diversi nella dichiarazione rispetto alla definizione. (Questo è importante in un progetto enorme quando - per qualsiasi motivo - vuoi cambiare il nome nella definizione, ma non vuoi ricompilare milioni di righe di codice che dipendono dalla dichiarazione.)
sbi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.