将 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()).
我正在关注 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()).