2015-08-19 51 views
0

我正在關注V8的Embedder's Guide以從JavaScript調用C++。我在設置訪問器時遇到錯誤。具體來說,下面的代碼在VS2015當前版本的V8下無法編譯。將C++函數綁定到V8時調用SetAccessor時出錯

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(); 
} 

設置員所需的函數簽名是否與指南中的不同?

回答

0

我會在這裏把這個留給其他人試圖跟着導遊:對二傳手函數簽名爲錯,但如果你掬得太快,你會錯過它。該指南有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) 

請注意,這是無效而不是價值(這是point_templ-> SetAccessor (),而不是point_templ.SetAccessor())。