2017-09-21 17 views
0

Native C 코드 용 C++/CLI 래퍼를 만들었습니다. 해당 C 코드는 자신의 Object typedef이고 연결시 오류가 C2872 'Object': ambiguous symbol입니다. 컴파일러의 출력은 다음과 같습니다Visual Studio에서 'Object'를 처리하는 방법 : 모호한 기호

1>C:\src\OS_kernel.h(27): error C2872: 'Object': ambiguous symbol 
1>C:\src\OS_types.h(261): note: could be 'ObjectStruct *Object' 
1>C:\src\OS_kernel.h(27): note: or  'System::Object' 

그것은 내가 C++/CLI 래퍼의 목적으로이 네이티브 C 코드를 조롱하고 있음을 언급 할 가치가있을 수 있습니다; 소스 코드를 사용할 수없는 경우 사용할 수없는 잠재적 인 솔루션이 열리는 지 확실하지 않습니다. 거기에 코드를 사용할 정의를 지정하는 방법이 있다고 생각하지만이를 지정하는 방법을 모르겠습니다. 그게 가능하니? ObjectStruct *Object을 사용하도록 지정하고 싶습니다.

잠재적으로 수백 또는 수천 개의 개별 장소가 될 수 있으므로 모의 코드를 수정하지 않아도 좋을 것입니다.

제쳐두고, 나는 또한 BufferBoolean과 같은 네이티브 라이브러리가 사용하는 다른 유형에 대해서도이 오류가 발생합니다.

+1

범위 분석 연산자'::'와 함께':: Object'를 사용하여 전역 범위 C'Object'를 참조 할 수 있어야합니다. – crashmstr

+0

그게 효과가! 슬프게도,이 해결책은 모든 모호한 오류가 모의 코드에서 발생하는 모든 장소를 터치해야한다는 것을 의미합니다. –

답변

3

좋아요, OS_kernel.h에서 오류가 발생했기 때문에 배치하는 C 코드의 일부라고 생각합니다.

명백히 가능한 해결책 중 하나는 예약어로 Object을 처리하고 사용하지 않도록 C 코드를 편집하는 것입니다. 이것이 가장 정확한 해결책이라고 주장 할 수는 있지만 그렇게 할 수는 없습니다.

C 코드를 참조하는 방법에 따라 C++로 컴파일하고 네임 스페이스 내에 완전히 넣을 수 있습니다. 이렇게하면 C 코드 (현재 C++ 코드)가 Object을 사용할 때 네임 스페이스 내에 typedef가 표시되고 코드에서 네임 스페이스를 참조 할 수있는 옵션이 제공됩니다.

당신이 라이브러리의 헤더 파일에서이 오류가 발생하고 있다는 사실

당신이 using namespace System; 지시자를 가지고 있음을, 그리고 라이브러리의 헤더 파일의 #include이 오면 나에게 표시 지시어를 사용하여 해당 후. using namespace System;을 제거하거나 적어도 #include 이후에 옮기는 것이 좋습니다. 이렇게하면 라이브러리 헤더에서 오류가 발생하지 않고 코드에서 처리해야합니다.

+0

Ahh, using namespace System 제거에 대한 좋은 제안. 감사! –