컴파일러 경고(수준 1) C4407
멤버에 대해 표현이 다른 포인터를 캐스트합니다. 컴파일러가 잘못된 코드를 생성한 것 같습니다.
포인터-멤버 형식 간에 잘못된 캐스트가 검색되었습니다.
설명
Visual Studio 2005에서 수행된 컴파일러 규칙 작업으로 인해 C4407을 생성할 수 있습니다. 이제 멤버에 대한 포인터에는 정규화된 이름과 주소 연산자(&)가 필요합니다.
여러 상속 포인터-멤버 간에 단일 상속 포인터-멤버로 캐스팅하는 경우 C4407이 발생할 수 있습니다. 경우에 따라 이 작업이 작동할 수 있지만, 멤버에 대한 단일 상속 포인터 표현이 충분한 정보를 보유하지 않기 때문에 작동하지 않는 경우도 있습니다. 컴파일이 /vmm
도움이 될 수 있습니다. 자세한 내용은 , /vms
/vmv
(범용 표현)을 참조/vmm
하세요. 기본 클래스를 다시 정렬해 볼 수도 있습니다. 컴파일러는 기본 클래스가 파생에서 0이 아닌 오프셋에 있으므로 변환에서 정보 손실을 감지합니다.
예시
다음 샘플에서는 C4407을 생성하고 이를 해결하는 방법을 보여 줍니다.
// C4407.cpp
// compile with: /W1 /c
struct C1 {};
struct C2 {};
struct C3 : C1, C2 {};
typedef void(C3::*PMF_C3)();
typedef void(C2::*PMF_C2)();
PMF_C2 f1(PMF_C3 pmf) {
return (PMF_C2)pmf; // C4407, change type of cast,
// or reverse base class inheritance of C3 (i.e. : C2, C1)
}