2009-04-01 15 views
0

L'erreur que je reçois:Impossible de convertir argument pointeur de fonction

error C2664: 'v8::FunctionTemplate::New' : cannot convert parameter 1 from 'v8::Handle<T> (__cdecl *)(const v8::Arguments &)' to 'v8::InvocationCallback' 

définitions pertinentes:

typedef Handle<Value> (*InvocationCallback)(const Arguments& args); 




template<class C> class V8ScriptClass 
{ 
public: 
    template<class C, typename Rtype, typename Ptype1, Rtype (C::*FuncPtr)(Ptype1)> 
    void RegisterFunc(const char* const scriptname) 
    { 
     objtemplate->Set(
      v8::String::New(scriptname), 
      v8::FunctionTemplate::New(
      V8ScriptClass<C>::RelayCallback<C, Rtype, Ptype1, FuncPtr> 
       )); 
    }; 

template<typename Rtype, typename Ptype1, Rtype (*FuncPtr)(Ptype1 param1)> 
static v8::Handle<v8::Value> RelayCallback(const v8::Arguments& args) 
{ 
    std::cerr<<__FUNCTION__<<std::endl; 
    v8::HandleScope handle_scope; 
    return handle_scope.Close(toJSType(((FuncPtr)(toCType(args[0]))))); 
}; 

Attend à moi comme le typedef et la signature de la fonction réelle sont identiques.

edit: a oublié une déclaration:

class EXPORT FunctionTemplate : public Template { 
public: 
    /** Creates a function template.*/ 
    static Local<FunctionTemplate> New(
     InvocationCallback callback = 0, 
     Handle<Value> data = Handle<Value>(), 
     Handle<Signature> signature = Handle<Signature>()); 
+0

Où utilisez-vous InvocationCallback? – dirkgently

+0

a ajouté la déclaration manquante – heeen

+0

Non seulement la signature (= 0 est un argument par défaut) mais l'appel réel. – dirkgently

Répondre

1

J'ai trouvé l'erreur. le modèle RelayCallback prend un pointeur de fonction statique en argument, et j'ai essayé de l'instancier avec un pointeur de fonction membre. Je devais juste le changer en un argument de modèle de pointeur de fonction de membre.