2

NodeJS コア (crypto) から簡単なコードを抜粋しました。

ASSERT_IS_BUFFER(args[0]);
ssize_t klen = Buffer::Length(args[0]);

ただし、これを独自のネイティブ拡張でコンパイルするとnode-gyp、次のエラーが発生します。

../deps/v8/include/v8.h:202:5: error: assigning to 'v8::Object *volatile' from incompatible type
      'v8::Value *'
    TYPE_CHECK(T, S);
    ^
../deps/v8/include/v8.h:145:37: note: expanded from macro 'TYPE_CHECK'
    *(static_cast<T* volatile*>(0)) = static_cast<S*>(0);      \
                                    ^
../src/openssljs.cc:300:33: note: in instantiation of function template specialization 'v8::Handle<v8::Object>::Handle<v8::Value>'
      requested here
                ssize_t klen = Buffer::Length(args[0]);
                                              ^

何がこれを引き起こしているのでしょうか?

4

1 に答える 1

3

ノードの 1 つのバージョン (HEAD など) からこれらの行を取得しましたが、システムのヘッダー ファイルはノードの別のバージョンに属しています。

古いバージョンBuffer::Lengthでは受け入れv8::Handle<v8::Object>ていましたが、新しいバージョンではv8::Handle<v8::Value>のタイプに一致するものを受け入れますargs[0]

署名を変更したコミット: https://github.com/joyent/node/commit/c8c638a84195e5571f4ece881375909e1f4b82a8

システムにインストールされている node.js を更新するか、明示的なキャストを使用できます。args[0].As<Object>()

于 2012-10-31T12:08:32.747 に答える