C ++ - 생성자 과부하 - 개인 및 공개
-
22-07-2019 - |
문제
다음 코드가 다음 오류를 제공하는 이유를 말씀해 주시겠습니까? 과부하 "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);