помилка: аргумент за замовчуванням вказаний для параметра 1


95

Я отримую це повідомлення про помилку з кодом нижче:

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

Спочатку я подумав, що параметри за замовчуванням не дозволяються як перший параметр у C ++, але це дозволено.


Чи можете ви детальніше розповісти?
Етьєн де Мартель

Я використовую Eclipse CDT з MinGW 5.1.6 у Windows.
pocoa

Відповіді:


208

Ви, ймовірно, переосмислюєте параметр за замовчуванням під час реалізації функції. Це має бути визначено лише у декларації функції.

//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
Тепер сказано: рядок Money :: asString () 'не відповідає жодному в класі `Money'
pocoa

1
@pocoa Вам все ще потрібно зберегти bool shortVersionпараметр, просто видаліть або прокоментуйте= true
Yacoby

@Yacoby: Спасибі, ви мали рацію. Це не має сенсу, дуже заплутано.
pocoa

6
@pocoa: Насправді це має сенс. Якщо ви задаєте параметри за замовчуванням для параметрів, вони заповнюються у абонента . Тож вони повинні бути в декларації функції, бо це те, що мають бачити абоненти. Якби вам довелося повторити їх у визначенні, це було б зайвим і великим клопотом підтримувати. (Ось чому я не згоден з Yacoby щодо коментування параметрів за замовчуванням у реалізації. IME, у реальних проектах такі коментарі рано чи пізно будуть несинхронізовані з декларацією.
sbi

1
Фактичне визначення таке std::string Money::asString(bool). Зауважте, що він навіть не містить імені параметра. І дійсно, ви можете використовувати різні назви в декларації, ніж у визначенні. (Це важливо у величезному проекті, коли - з якихось причин - ви хочете змінити назву у визначенні, але не хочете перекомпілювати мільйони рядків коду, які залежать від декларації.)
sbi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.