将c++函数绑定到V8时调用SetAccessor出错

Error calling SetAccessor when binding C++ functions to V8

本文关键字:调用 SetAccessor 出错 V8 c++ 函数 绑定      更新时间:2023-10-16

为了从JavaScript调用c++,我遵循了V8的嵌入式指南。我遇到了设置访问器的错误。具体来说,以下代码无法在VS2015的V8当前版本下为我编译。

point_templ.SetAccessor(String::NewFromUtf8(isolate, "x"), GetPointX, SetPointX);

如果我把它改成:

,我可以让它像预期的那样工作
point_templ->SetAccessor(String::NewFromUtf8(isolate, "x"), GetPointX);

我就是不能让它接受setter函数。我得到一个错误,说明"没有重载函数的实例"v8::ObjectTemplate::SetAccessor"匹配参数列表"。为了记录,我没有修改指南中的示例函数。它们如下(从指南中复制):

void GetPointX(Local<String> property, const PropertyCallbackInfo<Value>& info)
{
   Local<Object> self = info.Holder();
   Local<External> wrap = Local<External>::Cast(self->GetInternalField(0));
   void* ptr = wrap->Value();
   int value = static_cast<Point*>(ptr)->x_;
   info.GetReturnValue().Set(value);
}
void SetPointX(Local<String> property, Local<Value> value, const PropertyCallbackInfo<Value>& info)
{
   Local<Object> self = info.Holder();
   Local<External> wrap = Local<External>::Cast(self->GetInternalField(0));
   void* ptr = wrap->Value();
   static_cast<Point*>(ptr)->x_ = value->Int32Value();
}

setter所需的函数签名与指南中不同吗?

我将把这里留给那些试图遵循指南的人:setter 的函数签名是错误的,但是如果你浏览得太快,你会错过它。指南的setter为:

void SetPointX(Local<String> property, Local<Value> value, const PropertyCallbackInfo<Value>& info) 

函数签名实际上应该是:

 void SetPointX(Local<String> property, Local<Value> value, const PropertyCallbackInfo<void>& info)

请注意,它是void而不是Value(并且它是point_templ->SetAccessor(),而不是point_templ.SetAccessor())。