2015-01-13 1 views
1

C++/CLI 프로젝트가 있습니다. 이 C++/CLI 프로젝트에서 System :: Action/Func에서 C++ 호출 가능으로 변환 할 수있는 고통을 덜어주기위한 작은 도우미를 작성했습니다. 다음은 한 가지 전문화의 예입니다.System :: Action을 호출 할 수 없습니다.^

template<> struct Callable<void()> { 
    Callable(System::Action^ f) : func(std::move(f)) {} 
    Handle<System::Action> func; 
    void operator()() { 
     System::Action^ f = *func; 
     f(); 
    } 
}; 

그러나이 코드는 컴파일되지 않습니다. System::Action::Invoke에 액세스 할 수 없으며 호출 할 수 없다고 알려줍니다.

C++/CLI에서 System::Action을 어떻게 호출 할 수 있습니까?

+0

'std :: move'는 포인터를 추적 할 때 쓸모가 없습니다. 여러분은 포인터의 복사본을 만들지 않을 것입니다. 그리고'Handle '은 가능하면 안된다. Handle '일 필요가있다. –

+0

'Handle' 클래스가'gcroot'가 제공하지 않는 것은 무엇입니까? –

+0

@BenVoigt : 방금 도착했습니다 (C++/CLI에서). 나는 형식이 지정되지 않은 GCHandle 만 알고있었습니다. 나는 네가 전능함과 내 맹목에 익숙하다는 것을 알고 있으므로 잠시 앉아 있으십시오. – Puppy

답변

1

컴파일러가이 문제를 잘못보고 한 것 같습니다. 실제로이 문제는 System :: Action이 처리 할 수없는 네이티브 형식 인 인스턴스가 생성되는 다른 특수화 내부에있었습니다. 왜 실제로 오류 대신 질문에서 오류를 제공하기로 결정했는지 모르겠다.

+2

그것은 업입니다. 컴파일러는 chatroom의 이름을 알고 있습니다. –

1

msclr::gcroot을 사용하면 네이티브 형식 내에서 추적 포인터를 유지할 수 있습니다.

또한 템플릿으로 잘 작동합니다
#include <msclr\gcroot.h> 

struct CallableAction 
{ 
    msclr::gcroot<System::Action^> func; 
    CallableAction(System::Action^ f) : func(f) {} 
    void operator()() 
    { 
     func->Invoke(); 
    } 
}; 

, 난 그냥 제대로 완전히 인스턴스화되었는지 여부 그래서 걱정하지 않을 것이라고 단순화 :

이 코드는 VS2013에 나를 위해 잘 컴파일 오류가 확인되었습니다.

관련 문제