我决定尝试使用Developing C wrapper API for Object-Oriented C++ code中描述的模型为V8 API创建一个简单的C包装器。不幸的是,我对C ++并不太熟悉,所以我遇到了继承构造函数的问题。
v8capi.h
typedef struct V8Context V8Context;
#ifdef __cplusplus
extern "C" {
#endif
V8Context *V8_NewContext();
#ifdef __cplusplus
}
#endif
v8capi.cpp
#include <v8.h>
struct V8Context : public v8::Handle<v8::Context> { };
V8Context *V8_NewContext() {
v8::HandleScope hscope;
return new V8Context(v8::Context::New());
}
根据我的理解,new V8Context(...)
应该调用v8::Handle<T>
的构造函数,该构造函数需要Handle<T>
。 v8::Context::New()
会返回v8::Persistent<T>
,继承v8::Handle<T>
,因此应该有效。但实际上,它试图调用一个带const V8Context &
:
error C2664: 'V8Context::V8Context' : cannot convert parameter 1 from
'v8::Persistent<T>' to 'const V8Context &'
with
[
T=v8::Context
]
No user-defined-conversion operator available that can perform this
conversion, or the operator cannot be called
我做错了什么?
答案 0 :(得分:1)
V8Context
中没有定义构造函数,因此只有隐式复制构造函数才会显示为选项。您需要在V8Context
中明确定义一个构造函数,将v8::Persistent<T>
参数转发给它的基类。
答案 1 :(得分:0)
构造函数不是在C ++中继承的(虽然我相信C ++ 11中有一些直通功能),所以你必须在V8Context
编写自己的构造函数,明确调用正确的库类构造函数。
答案 2 :(得分:0)
据我了解,
new V8Context(...)
应该调用v8::Handle<T>
的构造函数。
new V8Context(...)
只会调用V8Context
中声明的构造函数;构造函数不是继承的。你需要添加一个,例如:
V8Context(v8::Handle<v8::Context> const & handle) :
v8::Handle<v8::Context>(handle)
{}
答案 3 :(得分:0)
new V8Context(...)
不会从v8::Handle<T>
调用构造函数,而是从V8Context
调用构造函数。由于您尚未定义一个,因此只能使用默认构造函数和复制构造函数(构造函数不可继承)。因此,它尝试调用复制构造函数并失败,因为参数无法转换为V8Context
。要解决您的问题,您需要向V8Context
添加一个适当的构造函数,它将参数转发给基础构造函数(可能不是给定的确切代码,这取决于您的参数看起来多么令人兴奋,但类似):
struct V8Context : public v8::Handle<v8::Context> {
V8Context(const v8::Handle<v8::Context>& handle): v8::Handle<v8::Context>(handle) {}
};
答案 4 :(得分:0)
您的V8Context
只有编译器生成的构造函数:
V8Cintext
为参数。您尝试传递的类型似乎与复制构造函数的签名不匹配。如果你想使用它,你需要明确地提供相应的构造。