错误:为参数1提供了默认参数


95

我收到以下代码的错误消息:

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

首先,我认为默认参数不允许作为C ++中的第一个参数使用,但允许使用。


您能否提供更多细节?
Etienne de Martel

我在Windows上使用带有MinGW 5.1.6的Eclipse CDT。
pocoa 2010年

Answers:


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 2010年

1
@pocoa您仍然需要保留bool shortVersion参数,只需删除或注释掉= true
Yacoby 2010年

@Yacoby:谢谢,你是对的。这没有任何意义,非常令人困惑。
pocoa 2010年

6
@pocoa:确实有道理。如果为参数提供默认值,则将在调用方处填写这些默认值。因此,它们必须位于函数的声明中,因为这是调用者需要查看的内容。如果您必须在定义中重复它们,那将是多余的,而且维护起来会比较麻烦。(这也是为什么我不同意Yacoby关于注释实现中的默认参数的原因。IME,在实际项目中,此类注释迟早会与声明不同步
。– sbi

1
实际的定义是std::string Money::asString(bool)。请注意,它甚至不包含参数的名称。而且,的确,您可以在声明中使用与定义中不同的名称。(这在大型项目中非常重要,因为无论出于何种原因,您都希望更改定义中的名称,但又不想重新编译依赖于声明的几百万行代码。)
2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.