Невозможно вызвать правильный конструктор для структуры, унаследованной от класса C ++ - PullRequest
0 голосов
/ 12 января 2012

Я решил попробовать создать простую оболочку C для API V8, используя модель, описанную в Разработка API оболочки C для объектно-ориентированного кода 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 ]

1 голос
/ 12 января 2012

В V8Context не определен конструктор, поэтому в качестве опции отображается только неявный конструктор копирования.Вам необходимо явно определить конструктор в V8Context, который перенаправляет аргумент v8::Persistent<T> в его базовый класс.

0 голосов
/ 12 января 2012

Ваш V8Context имеет только конструкторы, сгенерированные компилятором:

  • конструктор копирования, который синтезируется всякий раз, когда это необходимо, и явно не объявлен или сделан невозможным (например, производным от класса без копииконструктор).Этот конструктор принимает V8Cintext в качестве аргумента.
  • конструктор по умолчанию, который синтезируется при необходимости, когда нет явного конструктора, и все члены и базы могут быть построены по умолчанию.Конструктор Thos не имеет аргументов.

Кажется, тип, который вы пытаетесь передать, не соответствует сигнатуре конструктора копирования.Если вы хотите использовать его, вам нужно явно предоставить соответствующий конструктор.

0 голосов
/ 12 января 2012

new V8Context(...) вызывает не конструктор из v8::Handle<T>, а конструктор из V8Context.Поскольку вы не определили один, доступны только конструктор по умолчанию и конструктор копирования (конструкторы не наследуются).Поэтому он пытается вызвать конструктор копирования и терпит неудачу, так как аргумент не может быть преобразован в V8Context.Чтобы решить вашу проблему, вам нужно добавить соответствующий конструктор в V8Context, который перенаправляет аргумент в базовый конструктор (может не быть точным приведенным кодом, в зависимости от того, как точно ваши аргументы выглядят, но похожи):*

0 голосов
/ 12 января 2012

Насколько я понимаю, new V8Context(...) должен вызывать конструктор v8::Handle<T>.

new V8Context(...) будет вызывать только конструктор, объявленный в V8Context; конструкторы не наследуются. Вам нужно будет добавить что-то вроде:

V8Context(v8::Handle<v8::Context> const & handle) : 
    v8::Handle<v8::Context>(handle) 
{}
0 голосов
/ 12 января 2012

Конструкторы не наследуются в C ++ (хотя в C ++ 11, я думаю, есть некоторые сквозные функции), поэтому вам придется написать собственный конструктор в V8Context, который явно вызывает надлежащий конструктор базового класса.

...