error: đối số mặc định cho tham số 1


95

Tôi nhận được thông báo lỗi này với mã bên dưới:

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

Đầu tiên tôi nghĩ rằng các tham số mặc định không được phép như một tham số đầu tiên trong C ++ nhưng nó được phép.


Bạn có thể cung cấp thêm một chút chi tiết?
Etienne de Martel

Tôi đang sử dụng Eclipse CDT với MinGW 5.1.6 trên Windows.
pocoa

Câu trả lời:


208

Bạn có thể đang xác định lại tham số mặc định trong việc triển khai hàm. Nó chỉ nên được định nghĩa trong phần khai báo hàm.

//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
Bây giờ nó nói: string tiền :: asString () 'không phù hợp với bất kỳ trong lớp học' tiền'
pocoa

1
@pocoa Bạn vẫn cần giữ bool shortVersionthông số, chỉ cần xóa hoặc nhận xét= true
Yacoby

@Yacoby: Cảm ơn, bạn đã đúng. Nó không có ý nghĩa gì cả, rất khó hiểu.
pocoa

6
@pocoa: Thực ra, nó có ý nghĩa. Nếu bạn cung cấp các giá trị mặc định cho các tham số, các giá trị này sẽ được điền vào trình gọi . Vì vậy, chúng phải nằm trong phần khai báo của hàm, bởi vì đây là những gì người gọi cần xem. Nếu bạn phải lặp lại chúng ở định nghĩa thì việc duy trì sẽ là thừa và rắc rối hơn. (Đây cũng là lý do tại sao tôi không đồng ý với Yacoby về việc nhận xét các tham số mặc định trong quá trình triển khai. IME, trong các dự án thực tế, những nhận xét đó sớm hay muộn sẽ không đồng bộ với tuyên bố.
sbi

1
Định nghĩa thực tế là std::string Money::asString(bool). Lưu ý rằng nó thậm chí không bao gồm tên của tham số. Và, thực sự, bạn có thể sử dụng các tên khác trong khai báo so với trong định nghĩa. (Điều này là rất quan trọng trong dự án khổng lồ khi - đối với bất cứ lý do - bạn muốn thay đổi tên trong định nghĩa, nhưng không muốn cho hàng triệu người biên dịch lại các dòng mã mà phụ thuộc vào việc kê khai.)
SBI
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.