2012-03-13 3 views
1

멤버 함수 포인터를 템플릿 매개 변수로 전달하려고합니다. 여기에 코드입니다 :멤버 함수를 템플릿 매개 변수로 사용할 때 컴파일 오류가 발생했습니다.

template <typename Ret, typename T, Ret(T::*mptr)()> 
Handle<Value> get_value (Local<String> name, const AccessorInfo& info) 
{ 
    ... 
} 

template <typename Ret, typename T> 
void mbind (const char* name, Ret (T::*mptr)()) 
{ 
    .... 
    objectTemplate->SetAccessor (String::NewSymbol (name),get_value<Ret,T,mptr>); 
} 

그리고 이것은 내가지고있어 오류입니다 : 지금까지 내가 멤버 함수에 대한 포인터가 유효 템플릿 매개 변수입니다 알고

wrapper.h:184:5: error: ‘mptr’ is not a valid template argument for type ‘int (Cell::*)()’ 
wrapper.h:184:5: error: it must be a pointer-to-member of the form `&X::Y' 
... 

. 앞의 코드에 무엇이 잘못되었는지 이해하지 못합니다. 내가 사용하고있는 컴파일러는 우분투에서 g ++ 4.5.2입니다.

미리 감사드립니다.

는 UPDATE :

그건은 mptr는 런타임 변수로 코드가 잘못 해봐야 할 것 같습니다. 이 올바른지 ...

http://ideone.com/cv8pq

을 너무 : 다른 한편으로, 코드의 이전 발췌 컴파일? 컴파일러에 의존합니까?

답변

4

mptr은 런타임 변수입니다. 템플릿 매개 변수로 지정할 수 없습니다. http://ideone.com/CIL4C을 확인하십시오. 코드에 비슷한 일이 성공적으로 컴파일 및 작동 곳

편집

이상한 일이 http://ideone.com/cv8pq입니다.

+0

감사합니다. 멤버 함수에 대한 포인터를'mbind()'의 템플릿 매개 변수로 추가했습니다. 호출은 다음과 같습니다 :'mbind ("getWidth");' 이제 mbind()에 대한 호출을 더 간단하게 만들 수있는 다른 방법이 있는지 궁금합니다. 사용자 (모든 템플릿 인수를 지정하지 않아도 됨). 감사합니다. – user1192525

+0

그래서 ... 우리는 이것이 유효한지 (일부 컴파일러에서만 지원되는지) 알지 못합니다 : d – user1192525

1

mbind 이미 템플릿 인수를해야합니다

template <typename Ret, typename T, Ret (T::*mptr)()> 
void mbind (const char* name) { 
    objectTemplate->SetAccessor (String::NewSymbol (name),get_value<Ret,T,mptr>()); 
} 

PS를 : 당신은 get_value<>()를 잊어 버렸습니다.