无法在从C ++类继承的struct上调用正确的构造函数

时间:2012-01-12 17:27:44

标签: c++ c visual-c++ constructor wrapper

我决定尝试使用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

我做错了什么?

5 个答案:

答案 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为参数。
  • 默认构造函数,在需要时合成,当没有显式构造函数时,所有成员和基数都可以默认构造。 Thos构造函数没有参数。

您尝试传递的类型似乎与复制构造函数的签名不匹配。如果你想使用它,你需要明确地提供相应的构造。