error C3767 "후보 함수에 액세스할 수 없습니다."




 Native Code 를 C++/CLI 로 Wrapping 하다 보면 아래와 같은 오류 메시지가 발생할 수 있다.


error C3767: ... 후보 함수에 액세스할 수 없습니다.
error C3767: candidate function(s) not accessible

코드에서는 GetMemFileEx 의 접근 지정자가 분명히 "public" 인데도 불구하고 저 메시지가 나온다. 당황스럽다...
GetMemFileEx 가 리턴하는 값이 private 멤버변수의 포인터 이기에 해당 멤버 변수 또한 public 으로 변경하여도 똑같다.
무엇이 문제일까..





■ 원인

우선 error C3676 에러는 크게 2가지 경우에 발생하는 에러 메시지 이다. 그중 하나가 바로 아래와 같다.
C++/CLI 에서 기본적으로 Native Type 은 다른 Assembly 에 public 접근 지정을 갖지 않는다. 즉 private 접근 지정을 갖는다.
이것은 C++/CLI 의 컴파일 옵션인 /clr 에서 컴파일 과정중에 접근 지정자가 private 로 변경된다.


위와 같이 나의 코드에서 Native Type 인 CMemFileEx 의 접근 지정자가 컴파일 과정중에 private 로 변경된다.
(ref class 인 CCliMemFileEx 에서의 m_pMemFileEx 의 접근 지정자 private 와는 상관 없다.)


위와 같이 다른 Assembly 에서 CMemFileEx 타입의 사용에 있어서 error C3767 에러가 발생하게 된다.
(CLogInRequestPacket() 생성자의 인자가 CMemFileEx * 이다.)
Managed code 의 메소드에서 Native type 을 사용하려 할 때 발생한다.




■ 해결 방법

#pragma make_public() 을 이용한다.
make_public 은 Native type 이 public assembly 접근성을 갖게 해준다. 따라서 native type 이 컴파일 과정중에 private 접근성으로 바뀌지 않게 해준다. 자세한 사용방법은 MSDN을 참조.


나의 코드에서는 #pragma make_public() 을 사용한 모습이다.




■ History

2009.09.28 - 포스팅




■ 참조

1. Compiler Error C3767 (MSDN)
2. Strange C3767 error and constructor inheritance (gamedev.net)
3. make_public (MSDN)
4. error C3767: candidate function(s) not accessible between 2 clr dlls (Visual C++ Develop Center)
Posted by six605
,