błąd: domyślny argument podany dla parametru 1

96

Otrzymuję ten komunikat o błędzie z poniższym kodem:

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

Najpierw pomyślałem, że domyślne parametry nie są dozwolone jako pierwszy parametr w C ++, ale jest dozwolone.

pocoa
źródło
Czy mógłbyś podać trochę więcej szczegółów?
Etienne de Martel
Używam Eclipse CDT z MinGW 5.1.6 w systemie Windows.
pocoa

Odpowiedzi:

218

Prawdopodobnie przedefiniowujesz domyślny parametr w implementacji funkcji. Powinien być zdefiniowany tylko w deklaracji funkcji.

//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
źródło
1
Teraz jest napisane: string Money :: asString () 'nie pasuje do żadnego w klasie `Money'
pocoa
1
@pocoa Nadal musisz zachować bool shortVersionparametr, po prostu usuń lub skomentuj= true
Yacoby
@Yacoby: Dzięki, miałeś rację. To nie ma sensu, jest bardzo zagmatwane.
pocoa
7
@pocoa: Właściwie to ma sens. Jeśli podasz domyślne wartości parametrów, zostaną one wypełnione przez dzwoniącego . Więc oni mają być w deklaracji funkcja, bo to jest to, co dzwoniący trzeba zobaczyć. Gdybyś musiał powtórzyć je w definicji , byłoby to zbędne i bardziej kłopotliwe w utrzymaniu. (Dlatego też nie zgadzam się z Yacoby'm co do komentowania domyślnych parametrów implementacji. IME, w rzeczywistych projektach takie komentarze prędzej czy później nie będą zsynchronizowane z deklaracją.
sbi
1
Rzeczywista definicja to std::string Money::asString(bool). Zauważ, że nie zawiera nawet nazwy parametru. I rzeczywiście, możesz użyć innych nazw w deklaracji niż w definicji. (Jest to ważne w dużym projekcie, gdy - z jakichkolwiek powodów - chcesz zmienić nazwę w definicji, ale nie chcesz rekompilować milionów wierszy kodu, które zależą od deklaracji.)
sbi