При компиляции этого кода (часть SpiderMonkey):
template<IsAcceptableThis Test, NativeImpl Impl>
JS_ALWAYS_INLINE bool
CallNonGenericMethod(JSContext *cx, CallArgs args)
{
const Value &thisv = args.thisv();
if (Test(thisv))
return Impl(cx, args);
return detail::CallMethodIfWrapped(cx, Test, Impl, args);
}
template<Value ValueGetter(JSObject *obj)>
static JSBool
Getter(JSContext *cx, unsigned argc, Value *vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
return CallNonGenericMethod<ThisTypeArray::IsThisClass,
ThisTypeArray::GetterImpl<ValueGetter> >(cx, args);
}
Я получаю эту ошибку, связанную с вызовом CallNonGenericMethod
,
ошибка: параметр шаблона ‘ValueGetter’ типа ‘JS :: Value () (JSObject *) ‘не допускается в выражении с интегральной константой, поскольку оно не имеет целочисленного или перечислимого типа *
где ValueGetter
является
inline Value
TypedArray::lengthValue(JSObject *obj)
{
JS_ASSERT(obj->isTypedArray());
return obj->getFixedSlot(LENGTH_SLOT);
}
а также
template<Value ValueGetter(JSObject *obj)>
static bool
GetterImpl(JSContext *cx, CallArgs args)
{
JS_ASSERT(IsThisClass(args.thisv()));
args.rval().set(ValueGetter(&args.thisv().toObject()));
return true;
}
Я не мог найти полезную информацию в Интернете, и я изо всех сил пытаюсь найти, в чем проблема. Кто-нибудь может уточнить, пожалуйста?
Большое спасибо.
Это должно работать, вы передаете функцию, а C ++ должен превратить ее в указатель на функцию. Может быть, вы сделаете указатель на эту функцию явным:
template<Value (*ValueGetter)(JSObject *obj)>
[C++11: 14.1/4]:
Нетипизированный шаблон-параметр должен иметь один из следующих (необязательно квалифицированных cv) типов:
- интеграл или тип перечисления,
- указатель на объект или указатель на функцию,
- lvalue ссылка на объект или lvalue ссылка на функцию,
- указатель на член,
- станд :: nullptr_t.
Но указатель на функцию не выглядит так:
Value ValueGetter(JSObject *obj)
Это выглядит так:
Value (*ValueGetter)(JSObject *obj)
Тогда снова:
[C++11: 14.1/8]:
Не тип Шаблон-параметр типа «МассивT
» или же «Функция возвратаT
» настроен на тип «указатель наT
» или же «Указатель на функцию, возвращающуюT
», соответственно.
Та же самая формулировка существует в C ++ 03, в том же месте.
Итак, ваш код верен и у вас есть ошибка компилятора.
Возможно, вы можете обойти это, настроив Шаблон-параметр сами, хотя это будет зависеть от ошибки.