hata: parametre 1 için verilen varsayılan bağımsız değişken


96

Bu hata mesajını aşağıdaki kodla alıyorum:

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

Öncelikle, varsayılan parametrelere C ++ 'da birinci parametre olarak izin verilmediğini ancak izin verildiğini düşündüm.


Biraz daha detay verebilir misin?
Etienne de Martel

Windows'ta MinGW 5.1.6 ile Eclipse CDT kullanıyorum.
pocoa

Yanıtlar:


218

Muhtemelen işlevin uygulanmasında varsayılan parametreyi yeniden tanımlıyorsunuz. Yalnızca işlev bildiriminde tanımlanmalıdır.

//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
Şimdi şöyle diyor: string Money :: asString () ', `` Money' 'sınıfındaki
hiçbiriyle eşleşmiyor

1
@pocoa bool shortVersionParametreyi hala saklamanız gerekiyor , sadece= true
Yacoby

@ Yacoby: Teşekkürler, haklıydın. Hiç mantıklı değil, çok kafa karıştırıcı.
pocoa

7
@pocoa: Aslında mantıklı. Eğer parametreler için varsayılan değerleri verirsek, bu en doldurulur arayana . Dolayısıyla işlevin bildiriminde olmaları gerekir , çünkü arayanların görmesi gereken şey budur. Bunları tanımda tekrar etmeniz gerekse, gereksiz ve bakımı daha zahmetli olacaktır. (Bu aynı zamanda uygulamadaki varsayılan parametreleri yorumlama konusunda Yacoby ile aynı fikirde değilim. IME, gerçek projelerde bu tür yorumlar er ya da geç bildirimle
uyumsuz olacaktır

1
Gerçek tanım şudur std::string Money::asString(bool). Parametrenin adını bile içermediğini unutmayın. Ve gerçekten, beyanda tanımda olduğundan farklı isimler kullanabilirsiniz. (Hangi nedenle olursa olsun - tanımdaki adı değiştirmek, ancak bildirime bağlı olarak milyonlarca kod satırını yeniden derlemek istemediğinizde bu, büyük projede önemlidir.)
sbi,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.