error: argumen default diberikan untuk parameter 1

95

Saya mendapatkan pesan kesalahan ini dengan kode di bawah ini:

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

Pertama saya berpikir bahwa parameter default tidak diperbolehkan sebagai parameter pertama di C ++ tetapi diperbolehkan.

pocoa
sumber
Bisakah Anda memberikan sedikit lebih banyak detail?
Etienne de Martel
Saya menggunakan Eclipse CDT dengan MinGW 5.1.6 di Windows.
pocoa

Jawaban:

211

Anda mungkin mendefinisikan ulang parameter default dalam implementasi fungsi. Ini hanya harus didefinisikan dalam deklarasi fungsi.

//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
sumber
1
Sekarang dikatakan: string Money :: asString () 'tidak cocok dengan apa pun di kelas `Money'
pocoa
1
@pocoa Anda masih perlu menyimpan bool shortVersionparameter, cukup hapus atau komentari= true
Yacoby
@Yacoby: Terima kasih, Anda benar. Tidak masuk akal, sangat membingungkan.
pocoa
6
@pocoa: Sebenarnya, itu masuk akal. Jika Anda memberikan nilai default untuk parameter, ini diisi di pemanggil . Jadi mereka harus berada dalam deklarasi fungsi, karena inilah yang perlu dilihat pemanggil. Jika Anda harus mengulanginya pada definisi itu akan mubazir dan lebih merepotkan untuk mempertahankannya. (Ini juga mengapa saya tidak setuju dengan Yacoby tentang mengomentari parameter default dalam implementasi. IME, dalam proyek nyata komentar semacam itu akan tidak sinkron dengan deklarasi cepat atau lambat.
sbi
1
Definisi sebenarnya adalah std::string Money::asString(bool). Perhatikan bahwa itu bahkan tidak menyertakan nama parameter. Dan, memang, Anda bisa menggunakan nama yang berbeda di deklarasi daripada di definisi. (Ini penting dalam proyek besar ketika - untuk alasan apa pun - Anda ingin mengubah nama dalam definisi, tetapi tidak ingin mengkompilasi ulang jutaan baris kode yang bergantung pada deklarasi.)
sbi