2009-09-11 3 views
1

은 내가 여기도움말/내가 지금까지 무엇을

typedef int (*lua_CFunction) (lua_State *L);//target sig 

일치 할 필요는이 기능의 서명이있어 기능

오류 1 오류 C2664 : 'lua_pushcclosure' 을 변환 할 수 없습니다 '부스트 :: 기능'에서 에 매개 변수 2 'lua_CFunction'

사람은 누구나이 해결 될 수있는 방법을 알아?

+0

'boost :: function'을 일반 C 포인터로 변환하는 것과 같은 일반적인 문제를 다루는보다 광범위한 질문 : http://stackoverflow.com/questions/282372/demote-boostfunction-to-a-plain-function- 포인터 –

답변

4

이것은 직접 해결할 수 없습니다. 루아 API는 평범한 함수 포인터를 원한다. 이것은 단지 코드 포인터 일 뿐이며, 다른 것은 없다. 한편, boost::function은 함수 객체이므로 코드를 캡처하는 것이 아니라 상태를 캡처하기 때문에 일반 함수 포인터로 변환 할 수있는 방법은 없습니다. 귀하의 예제에서 캡처 된 상태는 self의 값입니다. 따라서 코드와 일부 데이터에 대한 코드 포인터가 있으며 대상 API는 코드 포인터 만 기대합니다.

+0

방금 ​​게시 한 답변을 읽어보십시오. 나의 원래 의혹은 (당신이 func ptr이 주를 붙잡을 수 없다는 점에서) 당신과 비슷하지만, 그것은 훌륭한 마술을 통해서 가능하다는 것이 밝혀졌습니다. – jameszhao00

+0

아니, 틀렸어. Boost 문서 (http://www.boost.org/doc/libs/1_37_0/doc/html/boost/function_base.html#id2623958-bb)에서 : "template Functor * target();' - Functor 타입의 타겟을 저장하면, 타겟의 주소를 반환하고 그렇지 않으면 NULL 포인터를 반환합니다. " - 그리고 당신의 경우에,'bind'의 결과는'lua_CFunction' 타입의 타겟을 저장하지 않을 것입니다. 마법은 없습니다 (일반적으로 마법은 없습니다). 임의의 8 바이트를 4로 압축 할 수는 없습니다. –

+0

http://lists.boost.org/Archives/boost/2008/12/145709.php –

1

암시 적 변환이 있기 때문에 컴파일러는 템플릿 매개 변수를 추론 할 수 없다는 문제가 있습니다.

함수 포인터를 함수 개체에 저장해야합니다.

function<int(lua_State *)> f = boost::bind(&LuaEngine::testFunc, this) 
registerFunction<LuaEngine>("testFunc", f); 

함수에 void 반환 유형이 필요하며 int로 변경해야합니다.

+0

리턴 유형을 int로 변경했습니다. 처음에는 그것을 잊어 버렸습니다. – jameszhao00

+0

위의 내용이 작동하지 않는다고 말하는 것입니까? 아니면 작동합니까? – jameszhao00

+0

내가 제공하는 예제가 작동해야합니다. 귀하의 예를 들어 작동하지 않는 이유입니다. 혼란에 대해 유감스럽게 생각합니다. – leiz

관련 문제