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

Error calling SetAccessor when binding C++ functions to V8

我正在关注 V8 的 Embedder's Guide,以便从 JavaScript 调用 C++。我在设置访问器时遇到错误。具体来说,以下代码无法在当前版本的 V8 和 VS2015 下为我编译。

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

如果我将其更改为:

,我可以使其大部分按预期工作
point_templ->SetAccessor(String::NewFromUtf8(isolate, "x"), GetPointX);

我只是无法让它接受 setter 函数。我收到一条错误消息,指出 "no instance of overloaded function "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()).