10

我希望我的班级拥有 av8::Context和 av8::External作为成员。因此,我认为我必须使用持久句柄。

class ScriptHelper {
public:
    ScriptHelper(v8::Persistent<v8::Context> Context) : context(Context) {
        // ...
    }
    // ...
private:
    v8::Persistent<v8::Context> context;
    v8::Persistent<v8::External> external;
};

但是,持久句柄在 V8 中是不可复制的,因此代码无法编译。错误发生在两个成员被初始化的行中。对于上下文,this 在构造函数的初始化列表中,对于外部,this 在构造函数体内。

1> 错误 C2440: '=' : 无法从 'v8::Primitive *' 转换为 'v8::Object *volatile'
1> 指向的类型不相关;转换需要 reinterpret_cast、C-style cast 或 function-style cast
1> include\v8\v8.h(603) : 请参阅对正在编译的函数模板实例化 'void v8::NonCopyablePersistentTraits::Uncompilable(void)' 的引用

我考虑过使用指向持久句柄的指针,但这似乎违反直觉,因为句柄的概念已经暗示了某种引用。此外,我认为句柄会被破坏,以便 V8 的内部垃圾收集器可以清理对象。

如何将 V8 对象持久存储为类成员?

更新:即使我使用指向持久句柄的指针,对于返回持久句柄的方法,我也会遇到相同的编译器错误。

4

1 回答 1

21

默认情况下,持久句柄使用不可复制的特征。显式传递可复制特征作为模板参数使它们像以前的版本一样工作。

Persistent<Value, CopyablePersistentTraits<Value>> persistent(isolate, value);
于 2014-03-25T23:34:02.530 回答