erro: argumento padrão fornecido para o parâmetro 1

95

Estou recebendo esta mensagem de erro com o código abaixo:

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

Primeiro pensei que os parâmetros padrão não são permitidos como um primeiro parâmetro em C ++, mas são permitidos.

pocoa
fonte
Você poderia dar mais alguns detalhes?
Etienne de Martel
Estou usando o Eclipse CDT com MinGW 5.1.6 no Windows.
pocoa

Respostas:

208

Você provavelmente está redefinindo o parâmetro padrão na implementação da função. Deve ser definido apenas na declaração da função.

//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
fonte
1
Agora diz: string Money :: asString () 'não corresponde a nenhum na classe' Money '
pocoa
1
@pocoa Você ainda precisa manter o bool shortVersionparâmetro, basta remover ou comentar o= true
Yacoby
@Yacoby: Obrigado, você estava certo. Não faz sentido, muito confuso.
pocoa
6
@pocoa: Na verdade, faz sentido. Se você fornecer valores padrão para os parâmetros, eles serão preenchidos no chamador . Portanto, eles precisam estar na declaração da função, porque é isso que os chamadores precisam ver. Se você tivesse que repeti-los na definição , seria redundante e mais complicado de manter. (É também por isso que discordo de Yacoby sobre comentar os parâmetros padrão na implementação. IME, em projetos reais, esses comentários estarão fora de sincronia com a declaração mais cedo ou mais tarde.
sbi
1
A definição real é std::string Money::asString(bool). Observe que ele nem inclui o nome do parâmetro. E, de fato, você pode usar nomes diferentes na declaração do que na definição. (Isso é importante em um grande projeto quando - por qualquer motivo - você deseja alterar o nome na definição, mas não deseja recompilar milhões de linhas de código que dependem da declaração.)
sbi