오류 : 매개 변수 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 년

답변:


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
이제 다음과 같이 표시됩니다. string Money :: asString () '은`Money'클래스의 어떤 것과도 일치하지 않습니다
pocoa

1
@pocoa 당신은 여전히 유지할 필요가 bool shortVersion1, 매개 변수를 바로 제거하거나 주석= true
Yacoby

@Yacoby : 감사합니다. 말도 안 돼 매우 혼란 스럽습니다.
pocoa 2010 년

6
@pocoa : 사실 말이 되네요. 매개 변수에 기본값을 제공하면 호출자에서 입력 됩니다. 그래서 그들은 이 발신자가 볼 필요가 무엇 때문에, 함수의 선언에있을 수 있습니다. 정의 에서 반복해야 한다면 중복되고 유지 관리가 더 번거로울 것입니다. (이것이 구현에서 기본 매개 변수를 주석 처리하는 것에 대해 Yacoby와 동의하지 않는 이유이기도합니다. IME, 실제 프로젝트에서 이러한 주석은 조만간 선언과 동기화되지 않을 것입니다.
sbi

1
실제 정의는 std::string Money::asString(bool)입니다. 매개 변수 이름도 포함되어 있지 않습니다. 그리고 실제로 선언에서 정의와 다른 이름을 사용할 수 있습니다. (이것은 어떤 이유로 든 정의에서 이름을 변경하고 싶지만 선언에 의존하는 수백만 줄의 코드를 다시 컴파일하고 싶지 않을 때 거대한 프로젝트에서 중요합니다.)
sbi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.