문제

다음 코드가 다음 오류를 제공하는 이유를 말씀해 주시겠습니까? 과부하 "C (int)"의 호출은 모호합니다.

C (char x)는 개인이므로 C (float) ctor 만 외부에서 볼 수 있으며 int를 플로트로 변환하여 호출해야한다고 생각합니다.

그러나 그것은 사실이 아닙니다.

class C
{
    C(char  x)
    {
    }
public:
    C(float t)
    {
    }
};

int main()
{
    C p(0);
}
도움이 되었습니까?

해결책

이것은 Scott Meyer의 "Effection C ++"에서 논의됩니다. 이것이 모호한 이유는 회원의 가시성을 변경하면 이미 존재하는 코드의 의미를 다른 곳에서 변경하지 않기를 원했기 때문입니다.

그렇지 않으면 C 클래스가 헤더 어딘가에 있다고 가정하십시오. 개인 C (int) 멤버가있는 경우 현재 존재하는 코드는 C (float)를 호출합니다. 어떤 이유로 든 C (int) 멤버가 공개 된 경우, 이전 코드는 그 어느 때에도 갑자기 그 멤버에게 전화 할 것입니다. 오래된 코드, 또는 그 기능이 변경된 기능.

편집 : 더 많은 이유 :

더 나쁜 것은 다음 두 가지 기능을 가지고 있다고 가정 해보십시오.

C A::foo() 
{
    return C(1.0);
}

C B::bar() 
{
    return C(1.0);
}

이 두 기능은 Foo 또는 Bar가 C의 친구로 선언되었는지 또는 A 또는 B가 상속되는지 여부에 따라 다른 기능을 호출 할 수 있습니다. was 동일한 코드 호출 다른 기능은 무섭습니다.

(아마도 Scott Meyer의 토론만큼 잘 갖추어지지는 않았지만 그 아이디어입니다.)

다른 팁

0은 an입니다 int 유형. 플로트 나 숯으로 암시 적으로 캐스트 될 수 있기 때문에 호출은 모호합니다. 이러한 목적에는 가시성이 관련이 없습니다.

어느 쪽이든 0.0, 0., 또는 0.0f, 또는 제거하십시오 C(char) 생성자 전적으로.

편집 : 표준의 관련 부분, 섹션 13.3 :

3) [...] 그러나 후보 기능과 인수 목록이 확인되면 최상의 기능의 선택은 모든 경우에 동일합니다.

  • 첫째, 후보 함수의 하위 집합 (적절한 수의 인수가 있고 특정 조건을 충족하는 다른 조건을 충족하는 것은 실행 가능한 함수 세트를 형성하도록 선택되었습니다 (13.3.2).
  • 그런 다음 각 인수를 각 인수의 해당 매개 변수와 일치시키기 위해 필요한 암시 적 변환 시퀀스 (13.3.3.1)를 기반으로 최상의 실행 가능한 함수가 선택됩니다.

4) 최고의 실행 가능한 기능이 존재하고 고유 한 경우 과부하 분해능이 성공하고 결과적으로이를 생성합니다. 그렇지 않으면 과부하 분해능이 실패하고 호출이 잘못되었습니다. 오버로드 해상도가 성공하고 사용되는 맥락에서 가장 좋은 실행 가능한 함수가 액세스 할 수 없을 때 (11 항) 프로그램은 잘못 형성됩니다.

가시성은 선택 과정의 일부가 아닙니다.

나는 그렇게 생각하지 않습니다 :

C p(0);

다음으로 변환되고 있습니다.

C(float t)

당신은 아마해야 할 것입니다 :

C p(0.0f);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top