2012-01-12 12 views
0

Developing C wrapper API for Object-Oriented C++ codeで説明されているモデルを使用して、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(...)Handle<T>を取るv8::Handle<T>のコンストラクタを呼び出す必要があります。 v8::Context::New()はを返します。これは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

私はV8に精通していません。しかし、その外観からは、C++の強みを非常に悪用していると思われます。また、「すてきなCインターフェイスを抽出する」ことは、不可能と困難の間のどこかにあります。 Cでは、HandleScopeとLocal <>の処理の恩恵を受けることはできません。間接的な追加レイヤーを使用することになってしまいました。おそらくC++を学ぶことを検討してください。 – sellibitze

+0

はい、API全体をラッピングするのは難しいと思いますが、例としてContextを使用しました。私はおそらく、関数を登録し、プロパティを設定/取得してVMをC++で初期化することができる最小限の機能を実装するつもりですが、ロード可能なモジュールはCで記述することができます。そのローカルスコープは、私はそれを永続的な(それは私がそれを理解する方法です、少なくとも)に変換することができます。 –

答えて

1

V8Contextに定義されているコンストラクタがないため、暗黙コピーコンストラクタのみがオプションとして表示されます。 v8::Persistent<T>引数を基本クラスに転送するコンストラクタをV8Contextに明示的に定義する必要があります。

+0

ありがとう、ありがとう。私が提供したリンクの例では、構造体にコンストラクタが実装されていないという事実が混乱していました。だから私はそれが継承されたと仮定した。 –

0

コンストラクタはC++ 11ではパススルー機能が継承されていないため、適切な基本クラスコンストラクタを明示的に呼び出すV8Contextに独自のコンストラクタを記述する必要があります。

0

私が理解するところでは、new V8Context(...)v8::Handle<T>のコンストラクタを呼び出す必要があります。

new V8Context(...)は、V8Contextで宣言されたコンストラクタを呼び出します。コンストラクタは継承されません。

V8Context(v8::Handle<v8::Context> const & handle) : 
    v8::Handle<v8::Context>(handle) 
{} 
0

new V8Context(...)V8Contextからv8::Handle<T>からコンストラクタが、コンストラクタを呼び出すことはありません:あなたのような何かが、1を追加する必要があります。あなたが定義していないので、デフォルトコンストラクタとコピーコンストラクタだけが利用できます(コンストラクタは継承できません)。したがって、コピーコンストラクタを呼び出そうとしますが、引数をV8Contextに変換できないため、失敗します。

struct V8Context : public v8::Handle<v8::Context> { 
    V8Context(const v8::Handle<v8::Context>& handle): v8::Handle<v8::Context>(handle) {} 
}; 
0

:あなたはベースのコンストラクタに引数を転送V8Contextに適切なコンストラクタを追加する必要があり、あなたの問題を解決するために(正確にあなたの引数がどのように見えるかexcatlyによって与えられたコード、が、同様ではないかもしれません)あなたのV8Contextはコンパイラが生成コンストラクタを持っています

  • (コピーコンストラクタなしでクラスから派生することによって)それが必要とされるたびに合成し、明示的に宣言されていないか、不可能とされたコピーコンストラクタ。このコンストラクタは引数としてV8Cintextをとります。
  • 必要なときに合成されるデフォルトのコンストラクタ、明示的なコンストラクタがなく、すべてのメンバーとベースをデフォルトで構築することができます。 Thosコンストラクタには引数はありません。

あなたが渡そうとした型がコピーコンストラクタのシグネチャと一致しないようです。それを使用したい場合は、対応するコンストラクターを明示的に提供する必要があります。

関連する問題